序章

Ansibleは、インフラストラクチャを自動化するためのシンプルでエージェントレスな方法です。 WordPressを何度もデプロイしていることに気付いた場合、Ansibleを使用すると時間を大幅に節約できます。

数行のYAML(単純なマークアップ言語)を使用して、新しいUbuntu14.04サーバーでWordPressをセットアップするという通常は面倒なプロセスを自動化します。 このチュートリアルで概説されているプロセスに従って、WordPressを多かれ少なかれインストールしますが、自動的にインストールします。

2つのサーバーを使用します。Ansibleを実行するビルドサーバーと、Ansibleを使用してWordPressをインストールするターゲットサーバーです。

前提条件

このチュートリアルを完了するには、次の設定が必要です。

  • Ubuntu14.04を実行しているビルドサーバー。 このサーバーにAnsibleをインストールします(このチュートリアルでは build-server と呼びます)。 このサーバーにログインし、このチュートリアルのすべてのファイルとコマンドをこのサーバーで実行します
  • Ubuntu14.04を実行しているターゲットサーバー。 このサーバーに(Ansible経由で)WordPressをインストールします(このチュートリアルでは wordpress-server と呼びます)
  • Sudo非rootユーザーが両方のサーバー用に構成されている
  • build-serversudoユーザーのSSHキーをwordpress-serverのsudoユーザーのauthorized_keysに追加します。 これは、このチュートリアルに従って設定できます。 build-server からチュートリアルを実行し、キーをwordpress-serverにアップロードする必要があります

(オプション)パスワードなしのsudoアクセス

高速ですが、wordpress-serverでパスワードなしのsudoアクセスを使用するのは安全性が低くなります

wordpress-server のsudoユーザーにこの特権を与えるには、sudoersファイルを編集する必要があります。 visudoと入力して、sudoersファイルを編集します。

  1. visudo

最後に次の行を追加します。

sammy ALL=(ALL) NOPASSWD: ALL

これは、ファイルの最後の行である必要があります。 これが最後の行であることが重要です。そうでない場合、オーバーライドされます。

NB:常にvisudoコマンドを使用してsudoersファイルを編集します。 これにより、ファイルを保存する前に変更が確認されます。これにより、誤ってマシンから完全にロックアウトされるのを防ぐことができます。

これを実行すると、パスワードを指定せずにwordpress-serverで次のコマンドを実行できるようになります。

  1. sudo echo "Hello"

これで、このチュートリアル全体を通して、-Kフラグなしでansible-playbookコマンドを実行できるため、sudoパスワードを手動で入力する必要はありません。

  1. ansible-playbook playbook.yml -i hosts -u sammy

ステップ1—Ansibleをインストールする

このセクションでは、Ansibleをbuild-serverにインストールします。

build-server にSSHで接続し、次のコマンドを実行してAnsibleをインストールします。

  1. sudo apt-get install ansible -y

次のコマンドを実行して、Ansibleがインストールされていることを確認できます。

  1. ansible --version

次のような出力が表示されます。

Output
ansible 1.5.4

ステップ2—ファイル構造を設定する

Ansibleをインストールしたので、Ansibleプレイブックのファイル構造を準備しましょう。

プレイブックのディレクトリを作成します。

  1. cd ~
  2. mkdir wordpress-ansible && cd wordpress-ansible

cdをこのディレクトリに追加し、2つのファイルを作成します。1つはplaybook.yml(WordPressをインストールするコマンドを記述します)と呼ばれ、もう1つはhostsと呼ばれます(これはAnsibleにコマンドを実行するサーバー):

  1. touch playbook.yml
  2. touch hosts

プレイブックを役割に分割することをお勧めします。 ロールは再利用可能なモジュールと考えることができます。 このプロジェクトでは、次の4つの役割を作成します。

  • サーバ
  • php
  • mysql
  • ワードプレス

プロジェクトのルートフォルダ(~/wordpress-ansible)から、rolesおよびcdというディレクトリを作成します。

  1. mkdir roles && cd roles

ansible-galaxyと呼ばれるAnsibleツールを使用してロールをブートストラップできます。 作成する役割ごとに、ansible-galaxy initを実行します。

  1. ansible-galaxy init server
  2. ansible-galaxy init php
  3. ansible-galaxy init mysql
  4. ansible-galaxy init wordpress

これにより、各ロールのファイル構造全体が作成されることに気付くでしょう。 これは、Ansibleのベストプラクティスに準拠しています。 ほとんどの場合、各ロールのtasks/main.ymlファイルに関心があります。

この時点で、次のファイル構造が必要です。

[.]
|_ playbook.yml
|_ hosts
|_ [roles]
      |_ [server]
            |_ ...
      |_ [php]
            |_ ...
      |_ [mysql]
            |_ ...
      |_ [wordpress]
            |_ ...                                    

ステップ3-ハンドブックを書く

このセクションでは、リモートサーバーにWordPressをインストールするためのコマンドを記述します。

インベントリ(hostsファイル)

Ansibleインベントリは、WordPressをインストールするサーバーについてAnsibleに通知します。 インベントリファイル(hosts)で定義されたサーバーまたはサーバーのグループに対してプレイブックを実行できます。 私たちの在庫はとてもシンプルです。

hostsを編集します:

  1. nano ~/wordpress-ansible/hosts

[wordpress]の行を追加し、その下にwordpress-serverのIPアドレスを追加します。

ホスト
[wordpress]
wordpress_server_ip

[wordpress]グループの下にさまざまなIPを配置できます。 これにより、すべてのサーバーでアクセスが設定されている場合、ここにリストされているすべてのサーバーでコマンドが実行されます。 これにより、WordPressを一度に複数の異なるサーバーにインストールできます。

プレイブック

プレイブックは、WordPressアプリの定義と考えることができます。 プレイブックでは、作成した役割を組み合わせて、便利なアプリケーション(この場合はWordPressサイト)を構成します。

プレイブックファイルを編集します。

  1. nano ~/wordpress-ansible/playbook.yml

これらのコンテンツを追加して、Ansibleにロールを実行するホスト(hostsファイル内のwordpressホスト)と実行するロールを指示します。

playbook.yml
- hosts: wordpress

  roles:
    - server
    - php
    - mysql
    - wordpress

プレイブックディレクトリに移動します。

  1. cd ~/wordpress-ansible/

プレイブックを実行して、build-serverからwordpress-serverへの基本的な接続が機能することを確認しましょう。 まだ何もしません。 接続をテストするだけです。

  1. ansible-playbook playbook.yml -i hosts -u sammy -K

プロンプトが表示されたら、wordpress-serverでsudoユーザーのsudoパスワードを入力します。

次のような出力が表示されます。

Output
ansible-playbook playbook.yml -i hosts -u sammy -K PLAY [wordpress] ************************************************************** GATHERING FACTS *************************************************************** ok: [188.166.68.134] PLAY RECAP ******************************************************************** 188.166.68.134 : ok=1 changed=0 unreachable=0 failed=0

これは、サーバーに接続できたことを示しています。 ただし、プレイはまだ定義されていないため、wordpress-serverでは何も実行されませんでした。 4つの役割の詳細を入力して、これを修正しましょう。

これが成功しなかった場合は、SSHキーを使用してbuild-serverからwordpress-serverにSSH接続できることを再確認してください。

ステップ3-役割の作成

サーバ

まず最初に; サーバーをセットアップしましょう。 このために、serverロールを編集します。

サーバーの役割は、必要なすべてのソフトウェアをターゲットサーバーにインストールします。 このファイルを編集します。

  1. nano roles/server/tasks/main.yml`

以下の内容を追加してください。 ---の行が1つしかないことを確認してください(デフォルトでは1行あるはずです)。

ロール/サーバー/タスク/main.yml
---
- name: Update apt cache
  apt: update_cache=yes cache_valid_time=3600
  sudo: yes

- name: Install required software
  apt: name={{ item }} state=present
  sudo: yes
  with_items:
    - apache2
    - mysql-server
    - php5-mysql
    - php5
    - libapache2-mod-php5
    - php5-mcrypt
    - python-mysqldb

これは次のことを行います。

  • apt-cacheを更新します(apt-get update
  • apt-get install Apache、MySQL、PHP、および関連ソフトウェア

インストールする内容の詳細に興味がある場合は、 Ubuntu14.04にLAMPを手動でインストールする方法のチュートリアルをご覧ください。

これで、次のようにプレイブックを実行できます。

  1. ansible-playbook playbook.yml -i hosts -u sammy -K

次のような出力が表示されます。

Output
ansible-playbook playbook.yml -i hosts -u sammy -K PLAY [wordpress] ************************************************************** GATHERING FACTS *************************************************************** ok: [188.166.68.134] TASK: [server | Update apt cache] ********************************************* ok: [188.166.68.134] TASK: [server | Install required software] ************************************ changed: [188.166.68.134] => (item=apache2,mysql-server,php5-mysql,php5,libapache2-mod-php5,php5-mcrypt,python-mysqldb) PLAY RECAP ******************************************************************** 188.166.68.134 : ok=3 changed=1 unreachable=0 failed=0

これを実行すると、http://wordpress_server_ip/のデフォルトのApacheページにアクセスできるようになります。 素晴らしい。 これで、Apacheがwordpress-serverにインストールされて実行されます。

TASK: [server | Update apt cache]の時点でビルドが無期限にハングする場合は、ターゲットサーバーのアクセス許可が不足している可能性があります。 wordpress-serverでsudoアクセスが正しく構成されていることを確認してください。

PHP

PHPの要件を整理しましょう。 これはPHPの役割で行います。 PHPのメインタスクファイルを編集します。

  1. nano roles/php/tasks/main.yml

以下を追加します(ここでも、---行はすでに存在しているはずです):

ロール/php/tasks/main.yml
---
- name: Install php extensions
  apt: name={{ item }} state=present
  sudo: yes
  with_items:
    - php5-gd 
    - libssh2-php

これにより、必要なPHP拡張機能がインストールされます。

MySQL

また、WordPressサイト用にMySQLデータベースを設定する必要があります。 これはmysqlの役割で行います。

これにはいくつかの変数が必要になります。 ロールの場合、defaults/main.ymlファイル内の任意の変数のデフォルト値を指定できます。

  1. nano roles/mysql/defaults/main.yml

データベース名、データベースユーザー名、データベースパスワード(作成するもの)をこの順序で追加します。 安全なwp_db_passwordを選択してください。

ロール/mysql/defaults/main.yml
---
wp_mysql_db: wordpress
wp_mysql_user: wordpress
wp_mysql_password: wp_db_password

データベースを作成するタスクとそれにアクセスするユーザーを追加します。

  1. nano roles/mysql/tasks/main.yml

次の内容を追加します。

ロール/mysql/tasks/main.yml
---
- name: Create mysql database
  mysql_db: name={{ wp_mysql_db }} state=present

- name: Create mysql user
  mysql_user: 
    name={{ wp_mysql_user }} 
    password={{ wp_mysql_password }} 
    priv=*.*:ALL

この役割は次のことを行います。

  • MySQLデータベースを作成する
  • MySQLユーザーを作成する
  • そのユーザーにデータベースへのアクセスを許可します

変数は以前のファイルから自動的に取り込まれるため、ここで何も変更する必要はありません。

パスワードの暗号化に興味があるかもしれません。 Ansibleはこのためのユーティリティとしてansible-vaultを提供していますが、ansible-vaultの完全な説明はこのチュートリアルの範囲を超えています。

WordPress

そして今、私たち全員が待っていた瞬間…WordPress!

サーバー要件がインストールされたら、WordPressをセットアップできます。 wordpressの役割を編集します。

roles/wordpress/tasks/main.ymlファイルにいくつかの異なるタスクを追加しているので、このセクションのために開いたままにしておきます。

  1. nano roles/wordpress/tasks/main.yml

まず、WordPressを/tmpディレクトリにダウンロードする必要があります(セキュリティを意識している場合は、証明書の検証が無効になっているため、ダウンロードが中断されます)。

ロール/ワードプレス/タスク/main.yml
---
- name: Download WordPress  get_url: 
    url=https://wordpress.org/latest.tar.gz 
    dest=/tmp/wordpress.tar.gz
    validate_certs=no 
    sudo: yes

ダウンロードしたら、gzipファイルを/var/wwwに抽出します。これは、ApacheがWebコンテンツの保存に使用する場所です。

ロール/ワードプレス/タスク/main.yml
- name: Extract WordPress  unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no 
  sudo: yes

抽出したファイルを使用して、Apacheのデフォルトのサイトドキュメントルートを更新して、WordPressサイトを指すようにします。

ロール/ワードプレス/タスク/main.yml
- name: Update default Apache site
  sudo: yes
  lineinfile: 
    dest=/etc/apache2/sites-enabled/000-default.conf 
    regexp="(.)+DocumentRoot /var/www/html"
    line="DocumentRoot /var/www/wordpress"
  notify:
    - restart apache
  sudo: yes

これにより、ApacheのデフォルトサイトのDocumentRootが更新され、/var/www/wordpressでダウンロードしたWordPressファイルを指すようになります。

ここで、notifyブロックが追加されていることがわかります。 これは、タスクが正常に完了した後にサービスを再起動するなどのタスクを実行する必要がある場合に使用されます。 notifyハンドラーは、タスクが変更された場合にのみ通知されます。

restart apacheのハンドラーを追加する必要があります。 これまでに持っていたものを保存し、roles/wordpress/handlers/main.ymlを開いて編集します。

  1. nano roles/wordpress/handlers/main.yml

これらのコンテンツを追加します。

ロール/ワードプレス/ハンドラー/main.yml
---
- name: restart apache
  service: name=apache2 state=restarted
  sudo: yes      

このハンドラーは、notify: restart apacheを指定するタスクが変更されたときに呼び出され、サーバーがApacheを再起動します。

WordPressの設定

roles/wordpress/tasks/main.ymlに戻ります。

最後に、WordPressサイトの構成を行う必要があります。

まず、サンプルの構成ファイルをコピーします。

ロール/ワードプレス/タスク/main.yml
- name: Copy sample config file
  command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
  sudo: yes

データベース情報と一致するように、このファイルの定数の一部を更新します。

ロール/ワードプレス/タスク/main.yml
- name: Update WordPress config file
  lineinfile:
    dest=/var/www/wordpress/wp-config.php
    regexp="{{ item.regexp }}"
    line="{{ item.line }}"
  with_items:
	- {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}        
    - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}        
    - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
  sudo: yes   

このタスクは、構成ファイルでDB_NAMEDB_USER、およびDB_PASSWORDを含む行を検索し、それらをプレイブックの変数に置き換えます。

上記の手順を正常に完了すると、WordPressの役割に関心のある2つのファイルが含まれます。

WordPressの完全なタスクファイルは次のとおりです。

ロール/ワードプレス/タスク/main.yml
---
- name: Download WordPress  get_url: 
    url=https://wordpress.org/latest.tar.gz 
    dest=/tmp/wordpress.tar.gz
    validate_certs=no

- name: Extract WordPress  unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
  sudo: yes

- name: Update default Apache site
  sudo: yes
  lineinfile: 
    dest=/etc/apache2/sites-enabled/000-default.conf 
    regexp="(.)+DocumentRoot /var/www/html"
    line="DocumentRoot /var/www/wordpress"
  notify:
    - restart apache

- name: Copy sample config file
  command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
  sudo: yes

- name: Update WordPress config file
  lineinfile:
    dest=/var/www/wordpress/wp-config.php
    regexp="{{ item.regexp }}"
    line="{{ item.line }}"
  with_items:
    - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}        
    - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}        
    - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
  sudo: yes

Apacheを再起動するためのファイルは次のとおりです(すでに作成されているはずです)。

ロール/ワードプレス/ハンドラー/main.yml
---
- name: restart apache
  service: name=apache2 state=restarted
  sudo: yes

終わったね! プレイブックをもう一度実行して、WordPressをインストールして構成します。

  1. ansible-playbook playbook.yml -i hosts -u sammy -K

http://your_server_ipでWordPressサイトをオンラインで表示できるはずです。

WordPress setup form

ここから手動でWordPressサイトのセットアップを完了することができます。

結論

おめでとう! これで、1つのコマンドで任意のUbuntu14.04サーバーにWordPressサイトをインストールできます。

  1. ansible-playbook playbook.yml -i hosts -u sammy -K

ターゲットサーバーのIPアドレスをhostsファイルに追加し、アクセス許可が正しく設定されていることを確認するだけです。

次のステップ

これは、AnsibleとWordPressを使い始めるための非常に簡単なイントロでした。 次の改善点を調べることに興味があるかもしれません。

  • Ansible Galaxyを探索し、Galaxyで独自の役割をホストする方法を学びます
  • セットアッププロセスを自動化して、WordPressサイトを手動で構成する必要がないようにします