※ Python3系のansibleに更新
※ Playbookを再利用しやすいように、ロールを使ったディレクトリ構成に変更
※ WordPressのインストールをWP-CLIを使用するように変更(プラグイン含む)
※ Serverspecでのサーバ構成のテストを追加 ⇒ いずれはのTestinfra(python版)でテストしたい
Ansibleとは
Ansibleはインフラ業務を自動化できるツールです。今回は、Ansibleを使用してLAMP環境構築及びWordPressのテーマ及びプラグインのインストールまでをおこなっていきます。
対象 | 操作の一例 |
---|---|
ネットワーク機器 | インターフェース設定、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.4 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起動設定 $ vi ~/.profile : # ssh start if ! service ssh status > /dev/null 2>&1 ; then sudo service ssh start > /dev/null 2>&1 fi # ssh起動 $ source .profile # 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.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.11 config file = None # pipからインストールした場合はコンフィグファイルが作成されない : python version = 3.6.9 (default, Jul 17 2020, 12:50:27) [GCC 8.4.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_config | Cisco社のネットワーク機器にコンフィグを投入 |
bigip_config | F5ネットワーク社のロードバランサにコンフィグを投入 |
vmware_guest | VMware上で仮想サーバを作成、削除 |
ec2_instance | Amazon EC2上でインスタンスを作成、削除 |
yum | OSにパッケージをインストール、アンインストール |
service/systemd | OSのサービスを起動、停止、再起動 |
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"}
変数
モジュールには様々なパラメータを付与できますが、これらの値を変数化しておき、実行に上書きできます。
簡単な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 [shell] ******************************************************************************************************************** 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 # 既にアップデート/インストール済みの為 #- locale # 英語のままの方がググりやすいので変更しない #- create_ec2-user - common - 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: umask変更 replace: dest: "{{ profile }}" regexp: "^#umask 022" replace: "umask 022" - 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: 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★ debug: msg: source "{{ profile }}" - 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: ansible.cfgファイル作成 file: path: /etc/ansible/ansible.cfg state: touch - name: ansible.cfgファイル編集済みかを確認 shell: grep "allow_world_readable_tmpfiles = True" /etc/ansible/ansible.cfg register: ansible_check failed_when: ansible_check.rc not in [0, 1] changed_when: false - name: テンポラリファイルに対して全ユーザに読み取り権限付与 blockinfile: dest: /etc/ansible/ansible.cfg insertafter: EOF # ファイルの末尾に追加 marker: "" # 追加部分を示すマーカー(空行) block: | [defaults] allow_world_readable_tmpfiles = True when: ansible_check.rc == 1 - 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: "{{wp_path}}/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: test@example.com
※ メールアドレス、ブログタイトルは適宜変更する
モジュールの使い方については、Ansible公式サイトで詳しく記載されています。
Module Index — Ansible Documentation
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 : 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★ TAGS: [] common : コマンドインストール TAGS: [] apache2インストール TAGS: [] apache2設定ファイル編集済みかを確認 TAGS: [] apache2設定ファイル編集 TAGS: [] apache2サービス起動 TAGS: [] apache2デーモンの自動起動設定済みかを確認 TAGS: [] apache2デーモンの自動起動設定 TAGS: [] apache2 : 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★ TAGS: [] php72のインストール TAGS: [] mariadb10_WP : mariadb10のインストール TAGS: [] mariadb10_WP : mysqlサービス起動 TAGS: [] mariadb10_WP : mysqlデーモンの自動起動設定済みかを確認 TAGS: [] mariadb10_WP : mysqlデーモンの自動起動設定 TAGS: [] mariadb10_WP : 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★ 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 : ansible.cfgファイル作成 TAGS: [] wordpress : ansible.cfgファイル編集済みかを確認 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 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [LAMP+WP環境構築(Ubuntu18.04環境)] ********************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************* ok: [localhost] TASK [common : sshデーモンの自動起動設定済みかを確認] ******************************************************************************************************************************************* ok: [localhost] TASK [common : sshデーモンの自動起動設定] ************************************************************************************************************************************************* skipping: [localhost] TASK [common : 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★] ******************************************************************************************************************************** ok: [localhost] => { "msg": "source \"/home/user01/.profile\"" } TASK [common : コマンドインストール] ***************************************************************************************************************************************************** ok: [localhost] TASK [apache2インストール] *********************************************************************************************************************************************************** ok: [localhost] TASK [apache2設定ファイル編集済みかを確認] *************************************************************************************************************************************************** ok: [localhost] TASK [apache2設定ファイル編集] ********************************************************************************************************************************************************* skipping: [localhost] TASK [apache2サービス起動] *********************************************************************************************************************************************************** ok: [localhost] TASK [apache2デーモンの自動起動設定済みかを確認] ************************************************************************************************************************************************ ok: [localhost] TASK [apache2デーモンの自動起動設定] ****************************************************************************************************************************************************** skipping: [localhost] TASK [apache2 : 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★] ******************************************************************************************************************************* ok: [localhost] => { "msg": "source \"/home/user01/.profile\"" } TASK [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 : 環境設定ファイルの再読み込みが必要(環境設定ファイル変更時)★] ************************************************************************************************************************** ok: [localhost] => { "msg": "source \"/home/user01/.profile\"" } 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 : ansible.cfgファイル作成] ******************************************************************************************************************************************* changed: [localhost] TASK [wordpress : ansible.cfgファイル編集済みかを確認] ************************************************************************************************************************************* ok: [localhost] TASK [wordpress : テンポラリファイルに対して全ユーザに読み取り権限付与] ********************************************************************************************************************************** skipping: [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 https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user 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=ml-slider) changed: [localhost] => (item=pixabay-images) changed: [localhost] => (item=polylang) changed: [localhost] => (item=siteorigin-panels) changed: [localhost] => (item=syntaxhighlighter) changed: [localhost] => (item=wordpress-importer) changed: [localhost] => (item=wp-multibyte-patch) PLAY RECAP ********************************************************************************************************************************************************************* localhost : ok=36 changed=3 unreachable=0 failed=0 skipped=13 rescued=0 ignored=0 # 環境設定ファイルの再読み込み $ source /home/user01/.profile
上記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('mysqlshow -uwpuser -pwpuser') 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.3/lib:/var/lib/gems/2.5.0/gems/rspec-core-3.9.2/lib /var/lib/gems/2.5.0/gems/rspec-core-3.9.2/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/ Command "tree" exit_status is expected to eq 0 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 "mysqlshow -uwpuser -pwpuser" stdout is expected to match /wp/ Finished in 3.06 seconds (files took 0.85845 seconds to load) 28 examples, 0 failures
Serverspecについては、ドットインストールで詳しく説明されています。
Serverspec入門 (全11回:有料会員)
Serverspec公式サイト
WordPress起動確認
WordPressサイトの表示
下記URLにアクセスして、サイトが表示されることを確認
http://localhost
管理画面の表示
下記URLにアクセスして、ログイン後に管理画面が表示されること、プラグインがインストールされていて有効化されていることを確認
http://localhost/wp-admin/