01c. 開発環境構築(Ubuntu18.04(WSL)+Ansible+Serverspec+WordPress(WP-CLI))

2020/05/30以下更新
Python3系のansibleに更新
※ Playbookを再利用しやすいように、ロールを使ったディレクトリ構成に変更
※ WordPressのインストールをWP-CLIを使用するように変更(プラグイン含む)
Serverspecでのサーバ構成のテストを追加 ⇒ いずれはのTestinfra(python版)でテストしたい

Ansibleとは

Ansibleはインフラ業務を自動化できるツールです。今回は、Ansibleを使用してLAMP環境構築及びWordPressのテーマ及びプラグインのインストールまでをおこなっていきます。

Ansibleが操作できる対象の一覧
対象操作の一例
ネットワーク機器インターフェース設定、VLAN設定などの各種コンフィグの投入など
ストレージボリュームの作成や削除、編集など
物理サーバ電源ON/OFF、IPMI(Intelligent Platform Management Interface)などの操作
仮想化基盤仮想マシン、仮想ネットワークの作成、削除、編集など
クラウド環境インスタンスやセキュリティグループなどの作成、削除、編集など
LinuxやWindowsなどのOSパッケージのインストール、設定ファイルの配布、サービス再起動など
特徴
項目内容
エージェント不要自動化の対象にエージェントソフトウェアをインストールする必要がない(要Python)
YAML形式学習コストが低い
冪統制(べきとうせい)既に成功している処理はスキップされ、まだ成功していない処理のみが実行されるので、Ansibleを繰り返し実行することができる

Ansibleの概要は下記を参照

Ubuntuのリセット

Ubuntuを初期化する場合、最初に思い浮かぶのはUbuntuをアンインストール後に再度インストールすることですが、Microsoft Store経由でインストールしたUbuntuは、「リセット」という操作を行うことで設定を初期化できます。

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
	:

参考
Windows 10のWSL環境を初期化してクリーンな状態に戻す

ssh接続設定

Teratermから接続できるように、SSHサーバの設定をします。

$ ssh -V						# open-sshがインストールされていることを確認
OpenSSH_7.6p1 Ubuntu-4, OpenSSL 1.0.2n  7 Dec 2017

$ sudo vi /etc/ssh/sshd_config
変更前:PasswordAuthentication no
変更後:PasswordAuthentication yes	# パスワード認証を許可

# SSHのホストキー生成
$ sudo ssh-keygen -A

# ssh接続確認(localhost)
$ ssh localhost
The authenticity of host 'localhost (127.0.1.1)' can't be established.
Are you sure you want to continue connecting (yes/no)? 				# yes
user01@localhost's password:
  :
$ exit

# ssh接続確認(dev01)
$ ssh dev01
The authenticity of host 'dev01 (127.0.1.1)' can't be established.
Are you sure you want to continue connecting (yes/no)? 				# yes
user01@dev01's password:
  :
$ exit
$ exit

以降、Teratermから作業

環境設定

# sudoコマンド実施時にパスワード入力を省略できるよう追記
$ sudo visudo
  :
# Allow members of group sudo to execute any command
#%sudo   ALL=(ALL:ALL) ALL 					# コメントアウト
%sudo   ALL=(ALL:ALL) NOPASSWD: ALL 		# 追記

$ sudo apt update			# パッケージを管理しているDBを最新の状態に更新
$ sudo apt dist-upgrade		# インストールされているパッケージを全更新。追加でパッケージが必要になった場合もインストールしてくれる
$ sudo apt install build-essential		# gcc, gdb ...などの開発ツールをインストール
$ python3 --version			# python3系がインストールされていることを確認
Python 3.6.9

# シンボリックリンクの設定
$ cd /usr/bin
$ sudo ln -s python3.6 python
$ python --version			# python3にシンボリックリンクが張られていることを確認
Python 3.6.9

# Pythonパッケージ管理ツールpipのインストール
$ sudo apt install python3-pip
$ pip3 install --upgrade pip 		# pipアップグレード
$ pip3 --version
pip 20.0.2 from /home/user01/.local/lib/python3.6/site-packages/pip (python 3.6)

Ansibleのインストール

$ pip3 install ansible

$ exec $SHELL --login		# ログインシェルとして起動して反映
$ ansible --version			# python3系を使用することを確認
ansible 2.9.6
  config file = None 		# pipからインストールした場合はコンフィグファイルが作成されない
   :
  python version = 3.6.9 (default, Nov  7 2019, 10:44:02) [GCC 8.3.0]

# インベントリファイル作成(warning回避の為)
$ sudo mkdir /etc/ansible
$ sudo touch /etc/ansible/hosts

$ ansible localhost -m ping -o
localhost | SUCCESS => {"changed": false, "ping": "pong"}	# pingモジュールがpongと応答を返すことを確認

Ansibleの自動化に必要な要素

Ansibleは、4つのインプットを動作時に必要とします。

モジュールとPlaybook

・モジュール
モジュールはAnsibleが「よくある作業を部品化」したもので、標準で2,000近くのモジュールを持っています。このモジュールにパラメータを与え、様々な作用をサーバやネットワーク機器に対して起こしていきます。新たなモジュールを作成することもできます。

モジュールの例
モジュール名機能
ios_configCisco社のネットワーク機器にコンフィグを投入
bigip_configF5ネットワーク社のロードバランサにコンフィグを投入
vmware_guestVMware上で仮想サーバを作成、削除
ec2_instanceAmazon EC2上でインスタンスを作成、削除
yumOSにパッケージをインストール、アンインストール
service/systemdOSのサービスを起動、停止、再起動
shell任意のコマンドをLinux OS上で実行
ping自動化の対象となるサーバに対して「Ansibleで自動化可能な状態であるか」をチェック
debug任意のメッセージを表示したり、変数に代入された値を確認

・Playbook
AnsibleではPlaybookを書くことで、「何をするか」を指示できます。Playbookにモジュールを並べて「何をするか」を指示していきます。

モジュールを単体で呼び出すと、モジュールの挙動を確認できます。

# localhostにpingモジュールを実行
$ ansible localhost -m ping -o -u user01 -k
SSH password:
127.0.0.1 | SUCCESS => {"changed": false, "ping": "pong"}		# pingモジュールがpongと応答を返すことを確認

 

クレデンシャル

クレデンシャルはAnsibleが対象ノードへ接続する際に使用する認証情報です。インベントリファイルに記述したり、コマンドラインの引数として記述することで、認証情報を渡せます。

# sshpassをインストール(ssh接続でパスワードを使用する為)
$ sudo apt install sshpass

$ ansible localhost -m ping -o -u user01 -k		# 接続ユーザを付与
SSH password:								# パスワードを入力

 

インベントリ

Ansibleでは対象ノードを管理するために、インベントリという情報を使用します。先のコマンドでは、インベントリ中のlocalhostを使用するように指定していました。これはインベントリが定義されていない状態で唯一使用できる、自ホストを表すインベントリの情報になります。

デフォルトのインベントリファイルは /etc/ansible/hosts です。こちらに記載しておけば、コマンドラインでインベントリファイルを指定する必要はありません。

インベントリファイルを以下のように作成します。

$ sudo vi /etc/ansible/hosts						# 以下のように作成
[dev]
dev01

# warning回避の為、pythonのバージョンを固定
$ sudo vi /etc/ansible/ansible.cfg
[defaults]
interpreter_python = /usr/bin/python
pipelining = True									# パイプラインを有効にする(高速化)

# devグループに対してpingモジュールを実行
$ ansible dev -m ping -o -u user01 -k		# devグループに対してpingモジュールを実行
dev01 | SUCCESS => {"changed": false, "ping": "pong"}

 

変数

モジュールには様々なパラメータを付与できますが、これらの値を変数化しておき、実行に上書きできます。

Ansible Documentation

簡単なPlaybookを作成する

PlaybookはYAML形式で記述する必要があります。YAMLはインデント(段下げ)が意味を持つ形式なので、スペースの数に注意が必要です(タブは使用できない)。

・Playbookのサンプル

$ vi sample_playbook.yml						# playbookの作成
- hosts: localhost
  vars:
    sample_vars: "Hello Ansible!!"
  tasks:
    - shell: uptime
      register: result

    - debug:
        msg: "{{ result.stdout }}"

    - debug:
        msg: "{{ sample_vars }}"

・Playbookの実行

$ ansible-playbook sample_playbook.yml -u user01 -k
SSH password:

PLAY [localhost] ****************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************
ok: [127.0.0.1]

TASK  ********************************************************************************************************************
changed: [127.0.0.1]

TASK [debug] ********************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": " 12:38:13 up 5 min,  0 users,  load average: 0.52, 0.58, 0.59"
}

TASK [debug] ********************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "Hello Ansible!!"
}

PLAY RECAP **********************************************************************************************************************
127.0.0.1                  : ok=4    changed=1    unreachable=0    failed=0

YAMLの書式が裏覚えな人は、ドットインストールで確認できます。
YAML入門 (全11回:無料)

LAMP環境構築のPlaybook

# Playbookをgit clone
$ cd ~
$ git clone https://github.com/hideame/ansible_ubuntu ansible_ubuntu

# 構成
ansible_ubuntu
├── roles
│   ├── apache2
│   │   └── tasks
│   │       └── main.yml
│   ├── apt-update
│   │   └── tasks
│   │       └── main.yml
│   ├── common
│   │   └── tasks
│   │       └── main.yml
│   ├── create_ec2-user
│   │   └── tasks
│   │       └── main.yml
│   ├── django
│   │   └── tasks
│   │       └── main.yml
│   ├── locale
│   │   └── tasks
│   │       └── main.yml
│   ├── mariadb10_WP
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── vars
│   │       └── main.yml
│   ├── php72
│   │   └── tasks
│   │       └── main.yml
│   ├── serverspec
│   │   └── tasks
│   │       └── main.yml
│   └── wordpress
│       ├── tasks
│       ├── └── main.yml
│       └── vars
│           └── main.yml
└── site.yml

# Rolesという仕組みを使用して、役割毎に記載
$ cat ansible_ubuntu/site.yml
- name: LAMP+WP環境構築(Ubuntu18.04環境)
  hosts: localhost              # localhostに対して実行
  become: yes                   # ユーザ変更を許可
  vars:
    - profile: /home/user01/.profile
  roles:
    - apt-update      # 既にアップデート/インストール済みの為
    - common
    #- locale          # 英語のままの方がググりやすいので変更しない
    - create_ec2-user
    - apache2
    - php72
    - mariadb10_WP
    - serverspec
    - wordpress
    #- django          # 作成中

 

各rolesの内容

$ cd ansible_ubuntu/roles

# パッケージのアップデート/インストール
$ cat apt-update/tasks/main.yml
- name: dist-upgrade
  become_user: root
  apt:
    update_cache: yes
    upgrade: dist
    state: latest

- name: 開発ツールのインストール
  become_user: root
  apt:
    name: build-essential
    state: present

# - name: libc-binパッケージを設定(後のパッケージインストールエラー回避)
#   become_user: root
#   shell: dpkg --configure libc-bin > /dev/null 2>&1
#   register: dpkg_check
#   failed_when: dpkg_check.rc not in [0, 1]
#   changed_when: false           # 設定済みか否かを判断できないので、毎回changedにならないように制御

# 共通設定
$ cat common/tasks/main.yml
- name: sshデーモンの自動起動設定済みかを確認
  shell: grep "sudo service ssh start" "{{ profile }}"
  register: ssh_check
  failed_when: ssh_check.rc not in [0, 1]
  changed_when: false

- name: sshデーモンの自動起動設定
  blockinfile:
    dest: "{{ profile }}"
    insertafter: EOF          # ファイルの末尾に追加
    marker: ""                # 追加部分を示すマーカー(空行)
    block: |
      # ssh start
      if ! service ssh status > /dev/null 2>&1 ; then
          sudo service ssh start > /dev/null 2>&1
      fi
  when: ssh_check.rc == 1

# - name: 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★
#   debug:
#     msg: source "{{ profile }}"

- name: コマンドインストール
  become_user: root
  apt:
    name: ['tree']
    state: present

# locale設定
$ cat locale/tasks/main.yml
- name: 日本語パッケージのインストール
  become_user: root
  apt:
    name: language-pack-ja
    state: present

- name: ロケール設定済かを確認
  shell: grep ja_JP.UTF-8 /etc/default/locale
  register: locale_check
  failed_when: locale_check.rc not in [0, 1]
  changed_when: false					# 変更していないので、changedにならないように制御 

- name: ロケールの変更
  become_user: root
  shell: update-locale LANG=ja_JP.UTF-8
  when: locale_check.rc == 1

- name: ロケール設定の再読み込みが必要(ロケール変更時)
  debug:
    msg: source /etc/default/locale

# ec2-userユーザ作成(AWS EC2に対してansibleでサーバ構築する為)
$ cat create_ec2-user/tasks/main.yml
- name: ec2-user作成済みかを確認
  shell: grep ec2-user /etc/passwd
  register: user_check
  failed_when: user_check.rc not in [0, 1]
  changed_when: false

- name: create_ec2-user
  become_user: root
  user:
    name: ec2-user
    password: "{{ 'ec2-user'|password_hash('sha512') }}"        # パスワードをハッシュ化して/etc/shadowに書き込む
    shell: /bin/bash
    groups: sudo        # サブグループ名を指定
    append: yes         # サブグループ名を追加所属
    state: present
  when: user_check.rc == 1

# apache2のインストール
$ cat apache2/tasks/main.yml
- name: apache2インストール
  become_user: root
  apt:
    name: apache2
    state: present

- name: apache2設定ファイル編集
  lineinfile:
    dest: /etc/apache2/apache2.conf
    line: "{{ item }}"
    state: present
  with_items:
    - '# apache2起動時のwarning回避'
    - AcceptFilter http none
    - AcceptFilter https none

- name: apache2サービス起動
  become_user: root
  service:
    name: apache2
    state: started

- name: apache2デーモンの自動起動設定済みかを確認
  shell: grep "sudo service apache2 start" "{{ profile }}"
  register: apache2_check
  failed_when: apache2_check.rc not in [0, 1]
  changed_when: false

- name: apache2デーモンの自動起動設定
  blockinfile:
    dest: "{{ profile }}"
    insertafter: EOF          # ファイルの末尾に追加
    marker: ""                # 追加部分を示すマーカー(空行)
    block: |
      # apache2 start
      if ! service apache2 status > /dev/null 2>&1 ; then
          sudo service apache2 start > /dev/null 2>&1
      fi
  when: apache2_check.rc == 1

# - name: 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★
#   debug:
#     msg: source "{{ profile }}"

# php72のインストール
$ cat php72/tasks/main.yml
- name: php72のインストール
  apt:
    name: ['php7.2', 'php7.2-mbstring', 'php7.2-mysql']
    state: present
    # php-mbstring: マルチバイト文字列拡張モジュール
    # php-mysql: MariaDB用ドライバ

# mariadb10のインストール
$ cat mariadb10_WP/tasks/main.yml
- name: mariadb10のインストール
  apt:
    name: ['mariadb-server-10.1','mariadb-client-10.1','python3-mysqldb']
    state: present

- name: mysqlサービス起動
  service:
    name: mysql
    state: started

- name: mysqlデーモンの自動起動設定済みかを確認
  shell: grep "sudo service mysql start" "{{ profile }}"
  register: mysql_check
  failed_when: mysql_check.rc not in [0, 1]
  changed_when: false

- name: mysqlデーモンの自動起動設定
  blockinfile:
    dest: "{{ profile }}"
    insertafter: EOF          # ファイルの末尾に追加
    marker: ""                # 追加部分を示すマーカー(空行)
    block: |
      # mysql start
      if ! sudo service mysql status > /dev/null 2>&1 ; then
          sudo service mysql start > /dev/null 2>&1
      fi
  when: mysql_check.rc == 1

- name: DB作成
  mysql_db:
    name: "{{ db_name }}"
    state: present

- name: DBユーザの作成
  no_log: true
  mysql_user:
    host: localhost
    name: "{{ db_user }}"
    password: "{{ db_pass }}"
    priv: "{{ db_name }}.*:ALL,GRANT"
    state: present

$ cat mariadb10_WP/vars/main.yml
db_name: wp
db_user: wpuser
db_pass: wpuser

# serverspecのインストール
$ cat serverspec/tasks/main.yml
- name: ruby2.5インストール
  apt:
    name: ruby2.5
    state: present

- name: ruby gemsのインストール
  gem:
    name: "{{ item }}"
    user_install: no                        # システム領域にインストール
    executable: /usr/bin/gem
    state: present
  with_items:
    - bundler
    - highline
    - rake                                  # Serverspecに必要なライブラリ
    - serverspec                            # サーバ構成テストツール

# WordPressのインストール
$ cat wordpress/tasks/main.yml
- name: WordPressのダウンロード
  get_url:
    url: "https://ja.wordpress.org/{{ wordpress_ver }}"
    dest: "/tmp/{{ wordpress_ver }}"

- name: WordPressが展開済みなら実施しない
  stat:
    path: "{{ wp_path }}"
  register: wordpress

- name: WordPressの展開
  unarchive:
    src: "/tmp/{{ wordpress_ver }}"
    dest: /var/www/
  when: not wordpress.stat.exists

- name: WordPressの所有者をwww-dataに変更
  file:
    path: "{{ wp_path }}"
    owner: www-data
    group: www-data
    state: directory
    recurse: yes

- name: WP-CLIコマンドのダウンロード
  get_url:
    url: https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
    dest: /usr/local/bin/wp
    owner: www-data
    group: www-data
    mode: 0755

- name: テンポラリファイルに対して全ユーザに読み取り権限付与
  lineinfile:
    dest: /etc/ansible/ansible.cfg
    line: allow_world_readable_tmpfiles = True
    state: present

- name: configファイル設定済みなら実施しない
  stat:
    path: "{{ wp_path }}/wp-config.php"
  register: wpconfig

- name: configファイル設定(DB設定情報)
  become_user: www-data
  shell: wp core config --dbhost="{{ hostname }}" --dbname="{{ db_name }}" --dbuser="{{ db_user }}" --dbpass="{{ db_pass }}" --path="{{ wp_path }}"
  when: not wpconfig.stat.exists

- name: WordPressのインストール
  become_user: www-data
  shell: wp core install --url="{{ hostname }}" --title="☂☂☂ボツワナに恵みの雨を☂☂☂" --admin_user="{{ wp_user }}" --admin_password="{{ wp_pass }}" --admin_email="{{ email }}" --path="{{ wp_path }}"
  when: not wpconfig.stat.exists

- name: DocumentRootの変更
  replace:
    dest: /etc/apache2/sites-available/000-default.conf
    regexp:  'DocumentRoot /var/www/html'
    replace: 'DocumentRoot /var/www/wordpress'

- name: apache2サービスの再起動
  service:
    name: apache2
    state: restarted

- name: テーマがインストール済みなら実施しない(habakiri)
  stat:
    path: "{{ wp_path }}/wp-content/themes/habakiri"
  register: habakiri

- name: テーマのインストール(habakiri)
  become_user: www-data
  shell: wp theme install habakiri --path="{{ wp_path }}"
  when: not habakiri.stat.exists

- name: php7.2-curlのインストール
  apt:
    name: php7.2-curl
    state: present
    # cocoonで必要の為

- name: 親テーマのダウンロード(cocoon)
  get_url:
    url: https://wp-cocoon.com/download/791/
    dest: /tmp/cocoon-master-2.1.3.6.zip

- name: 親テーマが展開済みなら実施しない(cocoon)
  stat:
    path: "{{wp_path}}/wp-content/themes/cocoon-master"
  register: cocoon

- name: 親テーマの展開(cocoon)
  unarchive:
    src: /tmp/cocoon-master-2.1.3.6.zip
    dest: "{{wp_path}}/wp-content/themes/"
  when: not cocoon.stat.exists

- name: 子テーマのダウンロード(cocoon-child)
  get_url:
    url: https://wp-cocoon.com/download/726/
    dest: /tmp/cocoon-child-master-1.1.1.zip

- name: 子テーマが展開済みなら実施しない(cocoon-child)
  stat:
    path: "{{wp_path}}/wp-content/themes/cocoon-child-master"
  register: cocoonChild

- name: 子テーマの展開(cocoon-child)
  unarchive:
    src: /tmp/cocoon-child-master-1.1.1.zip
    dest: "{{wp_path}}/wp-content/themes/"
  when: not cocoonChild.stat.exists

- name: テーマ配下の所有権をwww-dataに変更
  file:
    path: /var/www/html/wordpress/wp-content/themes
    owner: www-data
    group: www-data
    state: directory
    recurse: yes

- name: テーマの有効化(cocoon-child)
  become_user: www-data
  shell: wp theme activate cocoon-child-master --path="{{ wp_path }}"
  when: not cocoonChild.stat.exists

- name: プラグインのインストール
  become_user: www-data
  shell: wp plugin install "{{ item }}" --path="{{ wp_path }}" --activate
  with_items:
    - backwpup                          # WordPressのファイルとデータベースのバックアップを取得
    - broken-link-checker               # リンク切れを自動でチェック
    - contact-form-7                    # お問い合わせフォームプラグイン(メール機能は下記Gmail SMTPで実装
    - flickr-pick-a-picture             # 著作権リンク付きの写真を挿入
    - gmail-smtp                        # GmailのSMTPサーバー経由でメールを送信
    - google-sitemap-generator          # サイトマップをGoogleに送信してインデックスへの登録漏れを防ぐ
    - pixabay-images                    # パブリックドメイン(知的財産権のない)画像を簡単に挿入
    - polylang                          # WordPress に多言語機能を追加
    - syntaxhighlighter                 # ソースコードを綺麗に表示
    - wordpress-importer                # WordPressエクスポートファイルからインポートするツール
    - wp-multibyte-patch                # 日本語版WordPressのマルチバイト文字の取り扱いに関する不具合の修正

$ cat wordpress/vars/main.yml
hostname: localhost
wordpress_ver: wordpress-5.4-ja.tar.gz
wp_path: /var/www/wordpress
db_name: wp
db_user: wpuser
db_pass: wpuser
wp_user: wpadmin
wp_pass: wpadmin
email: XXXXXX@gmail.com

※ メールアドレスは適宜変更する

Playbookの実行

$ cd ansible_ubuntu

# 構文チェック
$ ansible-playbook site.yml --syntax-check
playbook: site.yml 								# エラーが表示されないことを確認

# タスクの一覧を確認
$ ansible-playbook site.yml --list-task
playbook: site.yml
  play #1 (localhost): LAMP+WP環境構築(Ubuntu18.04環境) TAGS: []
    tasks:
      common : sshサービス起動  TAGS: []
      common : sshデーモンの自動起動設定済みかを確認    TAGS: []
      common : sshデーモンの自動起動設定        TAGS: []
      common : コマンドインストール     TAGS: []
      create_ec2-user : ec2-user作成済みかを確認        TAGS: []
      create_ec2-user : ec2-userユーザの作成    TAGS: []
      apache2 : apache2インストール     TAGS: []
      apache2 : apache2デーモンの自動起動設定済みかを確認       TAGS: []
      apache2 : apache2設定ファイル編集 TAGS: []
      apache2 : apache2サービス起動     TAGS: []
      apache2 : apache2デーモンの自動起動設定済みかを確認       TAGS: []
      apache2 : apache2デーモンの自動起動設定   TAGS: []
      php72 : php72のインストール       TAGS: []
      mariadb10_WP : mariadb10のインストール    TAGS: []
      mariadb10_WP : mysqlサービス起動  TAGS: []
      mariadb10_WP : mysqlデーモンの自動起動設定済みかを確認    TAGS: []
      mariadb10_WP : mysqlデーモンの自動起動設定        TAGS: []
      mariadb10_WP : DB作成     TAGS: []
      mariadb10_WP : DBユーザの作成     TAGS: []
      serverspec : ruby2.5インストール  TAGS: []
      serverspec : ruby gemsのインストール      TAGS: []
      wordpress : WordPressのダウンロード       TAGS: []
      wordpress : WordPressが展開済みなら実施しない     TAGS: []
      wordpress : WordPressの展開       TAGS: []
      wordpress : WordPressの所有者をwww-dataに変更     TAGS: []
      wordpress : WP-CLIコマンドのダウンロード  TAGS: []
      wordpress : テンポラリファイルに対して全ユーザに読み取り権限付与  TAGS: []
      wordpress : configファイル設定済みなら実施しない  TAGS: []
      wordpress : configファイル設定(DB設定情報)        TAGS: []
      wordpress : WordPressのインストール       TAGS: []
      wordpress : DocumentRootの変更    TAGS: []
      wordpress : apache2サービスの再起動       TAGS: []
      wordpress : テーマがインストール済みなら実施しない(habakiri)      TAGS: []
      wordpress : テーマのインストール(habakiri)        TAGS: []
      wordpress : php7.2-curlのインストール     TAGS: []
      wordpress : 親テーマのダウンロード(cocoon)        TAGS: []
      wordpress : 親テーマが展開済みなら実施しない(cocoon)      TAGS: []
      wordpress : 親テーマの展開(cocoon)        TAGS: []
      wordpress : 子テーマのダウンロード(cocoon-child)  TAGS: []
      wordpress : 子テーマが展開済みなら実施しない(cocoon-child)        TAGS: []
      wordpress : 子テーマの展開(cocoon-child)  TAGS: []
      wordpress : テーマ配下の所有権をwww-dataに変更    TAGS: []
      wordpress : テーマの有効化(cocoon-child)  TAGS: []
      wordpress : プラグインのインストール      TAGS: []

# ドライラン(※ 実際にインストールしないので、途中で前提となるものがインストールされてない為エラー終了します。あまりやる必要ないかも)
$ ansible-playbook site.yml --check

# Playbookの実行
$ ansible-playbook site.yml

PLAY [LAMP+WP環境構築(Ubuntu18.04環境)] **********************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [localhost]

TASK [common : sshサービス起動] ******************************************************************************************
ok: [localhost]

TASK [common : sshデーモンの自動起動設定済みかを確認] *******************************************************************************
ok: [localhost]

TASK [common : sshデーモンの自動起動設定] *************************************************************************************
skipping: [localhost]

TASK [common : コマンドインストール] *****************************************************************************************
ok: [localhost]

TASK [create_ec2-user : ec2-user作成済みかを確認] **************************************************************************
ok: [localhost]

TASK [create_ec2-user : ec2-userユーザの作成] ****************************************************************************
skipping: [localhost]

TASK [apache2 : apache2インストール] *************************************************************************************
ok: [localhost]

TASK [apache2 : apache2デーモンの自動起動設定済みかを確認] **************************************************************************
ok: [localhost]

TASK [apache2 : apache2設定ファイル編集] ***********************************************************************************
skipping: [localhost]

TASK [apache2 : apache2サービス起動] *************************************************************************************
ok: [localhost]

TASK [apache2 : apache2デーモンの自動起動設定済みかを確認] **************************************************************************
ok: [localhost]

TASK [apache2 : apache2デーモンの自動起動設定] ********************************************************************************
skipping: [localhost]

TASK [php72 : php72のインストール] ****************************************************************************************
ok: [localhost]

TASK [mariadb10_WP : mariadb10のインストール] *****************************************************************************
ok: [localhost]

TASK [mariadb10_WP : mysqlサービス起動] **********************************************************************************
ok: [localhost]

TASK [mariadb10_WP : mysqlデーモンの自動起動設定済みかを確認] ***********************************************************************
ok: [localhost]

TASK [mariadb10_WP : mysqlデーモンの自動起動設定] *****************************************************************************
skipping: [localhost]

TASK [mariadb10_WP : DB作成] *****************************************************************************************
ok: [localhost]

TASK [mariadb10_WP : DBユーザの作成] *************************************************************************************
ok: [localhost]

TASK [serverspec : ruby2.5インストール] **********************************************************************************
ok: [localhost]

TASK [serverspec : ruby gemsのインストール] *******************************************************************************
ok: [localhost] => (item=bundler)
ok: [localhost] => (item=highline)
ok: [localhost] => (item=rake)
ok: [localhost] => (item=serverspec)

TASK [wordpress : WordPressのダウンロード] ********************************************************************************
ok: [localhost]

TASK [wordpress : WordPressが展開済みなら実施しない] ***************************************************************************
ok: [localhost]

TASK [wordpress : WordPressの展開] ************************************************************************************
skipping: [localhost]

TASK [wordpress : WordPressの所有者をwww-dataに変更] ***********************************************************************
ok: [localhost]

TASK [wordpress : WP-CLIコマンドのダウンロード] *******************************************************************************
ok: [localhost]

TASK [wordpress : テンポラリファイルに対して全ユーザに読み取り権限付与] **********************************************************************
ok: [localhost]

TASK [wordpress : configファイル設定済みなら実施しない] ***************************************************************************
ok: [localhost]

TASK [wordpress : configファイル設定(DB設定情報)] ****************************************************************************
skipping: [localhost]

TASK [wordpress : WordPressのインストール] ********************************************************************************
skipping: [localhost]

TASK [wordpress : DocumentRootの変更] *********************************************************************************
ok: [localhost]

TASK [wordpress : apache2サービスの再起動] *********************************************************************************
changed: [localhost]

TASK [wordpress : テーマがインストール済みなら実施しない(habakiri)] *******************************************************************
ok: [localhost]

TASK [wordpress : テーマのインストール(habakiri)] ****************************************************************************
skipping: [localhost]

TASK [wordpress : php7.2-curlのインストール] ******************************************************************************
ok: [localhost]

TASK [wordpress : 親テーマのダウンロード(cocoon)] *****************************************************************************
ok: [localhost]

TASK [wordpress : 親テーマが展開済みなら実施しない(cocoon)] ************************************************************************
ok: [localhost]

TASK [wordpress : 親テーマの展開(cocoon)] *********************************************************************************
skipping: [localhost]

TASK [wordpress : 子テーマのダウンロード(cocoon-child)] ***********************************************************************
ok: [localhost]

TASK [wordpress : 子テーマが展開済みなら実施しない(cocoon-child)] ******************************************************************
ok: [localhost]

TASK [wordpress : 子テーマの展開(cocoon-child)] ***************************************************************************
skipping: [localhost]

TASK [wordpress : テーマ配下の所有権をwww-dataに変更] ***************************************************************************
ok: [localhost]

TASK [wordpress : テーマの有効化(cocoon-child)] ***************************************************************************
skipping: [localhost]

TASK [wordpress : プラグインのインストール] ************************************************************************************
[WARNING]: Using world-readable permissions for temporary files Ansible needs to create when becoming an
unprivileged user. This may be insecure. For information on securing this, see
Understanding privilege escalation: become — Ansible Documentation
changed: [localhost] => (item=backwpup) changed: [localhost] => (item=broken-link-checker) changed: [localhost] => (item=contact-form-7) changed: [localhost] => (item=flickr-pick-a-picture) changed: [localhost] => (item=gmail-smtp) changed: [localhost] => (item=google-sitemap-generator) changed: [localhost] => (item=pixabay-images) changed: [localhost] => (item=polylang) changed: [localhost] => (item=syntaxhighlighter) changed: [localhost] => (item=wordpress-importer) changed: [localhost] => (item=wp-multibyte-patch) PLAY RECAP ********************************************************************************************************* localhost : ok=33 changed=2 unreachable=0 failed=0 skipped=12 rescued=0 ignored=0

上記Playbookの実行は2回目なので、ほとんどがokやskippedになっています。

サーバ構成のテスト(serverspec)

serverspec-initを実行

$ mkdir serverspec
$ cd serverspec

$ serverspec-init
Select OS type:

  1) UN*X 							# Ubuntuなのでこちらを選択
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)					# localを選択

Select number: 2

 + spec/
 + spec/localhost/
 + spec/localhost/sample_spec.rb
 + spec/spec_helper.rb
 + Rakefile
 + .rspec

 

テストファイル作成

$ cd spec/localhost
$ rm sample_spec.rb						# サンプルファイルは削除

# テストファイル作成
$ vi localhost_spec.rb
require 'spec_helper'

#describe package('httpd') do           # Resource(何をテストするか)
#  it { should be_installed }           # Matcher(どうあるべきか)
#end

#describe service('httpd') do
#  it { should be_running }             # httpdサービスが起動していること
#  it { should be_enabled }             # httpdサービスが起動時に有効になること
#end

# 該当パッケージがインストールされていることを確認(eachメソッドを使用)
%w(apache2 php7.2 php7.2-mbstring php7.2-mysql mariadb-server-10.1 mariadb-client-10.1 python3-mysqldb ruby2.5).each do |pkg|
  describe package(pkg) do
    it { should be_installed }
  end
end

# 該当パッケージがインストールされていることを確認(gem)
%w(bundler highline rake serverspec).each do |pkg|
  describe package(pkg) do
    it { should be_installed.by('gem') }
  end
end

# 該当サービスが起動していることを確認
%w(sshd apache2 mysql).each do |src|
  describe service(src) do
    it { should be_running }
  end
end

# デーモンの自動起動設定の確認
describe file('/home/user01/.profile') do
  it { should be_file }
  its(:content) { should match /sudo service ssh start/ }
  its(:content) { should match /sudo service apache2 start/ }
  its(:content) { should match /sudo service mysql start/ }
end

# ec2-userが作成されていることを確認
describe user('ec2-user') do
  it { should exist }
end

# treeコマンドのインストールを確認
describe command('tree') do
  its(:stdout) { should match /directories/ }
end

# 80番ポートが空いていることを確認
# describe port(80) do
#   it { should be_listening }
# end

# 3000番ポートが空いていることを確認
# describe command('firewall-cmd --list-ports') do
#   its(:stdout) { should match /3000\/tcp/ }
# end

# apache2設定ファイル編集を確認
describe file('/etc/apache2/apache2.conf') do
  it { should be_file }
  its(:content) { should match /AcceptFilter http none/ }
  its(:content) { should match /AcceptFilter https none/ }
end

# wordpressディレクトリの所有者/グループを確認
describe file('/var/www/wordpress') do
  it { should be_directory }
  it { should be_owned_by 'www-data' }
  it { should be_grouped_into 'www-data' }
end

# wpデータベースが作成されていることを確認
describe command('mysql -uwpuser -pwpuser -e"show databases;"') do
  its(:stdout) { should match /wp/ }
end

 

テスト実行

$ rake -T
(in /home/user01/serverspec)
rake spec:localhost  # Run serverspec tests to localhost 		# ホストごとにタスクが定義されている

# テスト実行
$ rake spec:localhost
(in /home/user01/serverspec)
/usr/bin/ruby2.5 -I/var/lib/gems/2.5.0/gems/rspec-support-3.9.2/lib:/var/lib/gems/2.5.0/gems/rspec-core-3.9.1/lib /var/lib/gems/2.5.0/gems/rspec-core-3.9.1/exe/rspec --pattern spec/localhost/\*_spec.rb

Package "apache2"
  is expected to be installed

Package "php7.2"
  is expected to be installed

Package "php7.2-mbstring"
  is expected to be installed

Package "php7.2-mysql"
  is expected to be installed

Package "mariadb-server-10.1"
  is expected to be installed

Package "mariadb-client-10.1"
  is expected to be installed

Package "python3-mysqldb"
  is expected to be installed

Package "ruby2.5"
  is expected to be installed

Package "bundler"
  is expected to be installed by "gem"

Package "highline"
  is expected to be installed by "gem"

Package "rake"
  is expected to be installed by "gem"

Package "serverspec"
  is expected to be installed by "gem"

Service "sshd"
  is expected to be running

Service "apache2"
  is expected to be running

Service "mysql"
  is expected to be running

File "/home/user01/.profile"
  is expected to be file
  content
    is expected to match /sudo service ssh start/
  content
    is expected to match /sudo service apache2 start/
  content
    is expected to match /sudo service mysql start/

User "ec2-user"
  is expected to exist

Command "tree"
  stdout
    is expected to match /directories/

File "/etc/apache2/apache2.conf"
  is expected to be file
  content
    is expected to match /AcceptFilter http none/
  content
    is expected to match /AcceptFilter https none/

File "/var/www/wordpress"
  is expected to be directory
  is expected to be owned by "www-data"
  is expected to be grouped into "www-data"

Command "mysql -uwpuser -pwpuser -e"show databases;""
  stdout
    is expected to match /wp/

Finished in 4.75 seconds (files took 1.43 seconds to load)
28 examples, 0 failures

Serverspecについては、ドットインストールで詳しく説明されています。
Serverspec入門 (全11回:有料会員)
Serverspec公式サイト

WordPress起動確認

WordPressサイトの表示

下記URLにアクセスして、サイトが表示されることを確認
http://localhost

 

管理画面の表示

下記URLにアクセスして、ログイン後に管理画面が表示されること、プラグインインストールされていて有効化されていることを確認
http://localhost/wp-admin/

WebProgramming入門

タイトルとURLをコピーしました