Ansibleを使用してUbuntu14.04へのWordPressのインストールを自動化する方法
序章
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ファイルを編集します。
visudo
最後に次の行を追加します。
sammy ALL=(ALL) NOPASSWD: ALL
これは、ファイルの最後の行である必要があります。 これが最後の行であることが重要です。そうでない場合、オーバーライドされます。
NB:常にvisudo
コマンドを使用してsudoersファイルを編集します。 これにより、ファイルを保存する前に変更が確認されます。これにより、誤ってマシンから完全にロックアウトされるのを防ぐことができます。
これを実行すると、パスワードを指定せずにwordpress-serverで次のコマンドを実行できるようになります。
sudo echo "Hello"
これで、このチュートリアル全体を通して、-K
フラグなしでansible-playbook
コマンドを実行できるため、sudoパスワードを手動で入力する必要はありません。
ansible-playbook playbook.yml -i hosts -u sammy
ステップ1—Ansibleをインストールする
このセクションでは、Ansibleをbuild-serverにインストールします。
build-server にSSHで接続し、次のコマンドを実行してAnsibleをインストールします。
sudo apt-get install ansible -y
次のコマンドを実行して、Ansibleがインストールされていることを確認できます。
ansible --version
次のような出力が表示されます。
Outputansible 1.5.4
ステップ2—ファイル構造を設定する
Ansibleをインストールしたので、Ansibleプレイブックのファイル構造を準備しましょう。
プレイブックのディレクトリを作成します。
cd ~ mkdir wordpress-ansible && cd wordpress-ansible
cd
をこのディレクトリに追加し、2つのファイルを作成します。1つはplaybook.yml
(WordPressをインストールするコマンドを記述します)と呼ばれ、もう1つはhosts
と呼ばれます(これはAnsibleにコマンドを実行するサーバー):
touch playbook.yml touch hosts
プレイブックを役割に分割することをお勧めします。 ロールは再利用可能なモジュールと考えることができます。 このプロジェクトでは、次の4つの役割を作成します。
- サーバ
- php
- mysql
- ワードプレス
プロジェクトのルートフォルダ(~/wordpress-ansible
)から、roles
およびcd
というディレクトリを作成します。
mkdir roles && cd roles
ansible-galaxy
と呼ばれるAnsibleツールを使用してロールをブートストラップできます。 作成する役割ごとに、ansible-galaxy init
を実行します。
ansible-galaxy init server ansible-galaxy init php ansible-galaxy init mysql ansible-galaxy init wordpress
これにより、各ロールのファイル構造全体が作成されることに気付くでしょう。 これは、Ansibleのベストプラクティスに準拠しています。 ほとんどの場合、各ロールのtasks/main.yml
ファイルに関心があります。
この時点で、次のファイル構造が必要です。
[.] |_ playbook.yml |_ hosts |_ [roles] |_ [server] |_ ... |_ [php] |_ ... |_ [mysql] |_ ... |_ [wordpress] |_ ...
ステップ3-ハンドブックを書く
このセクションでは、リモートサーバーにWordPressをインストールするためのコマンドを記述します。
インベントリ(hostsファイル)
Ansibleインベントリは、WordPressをインストールするサーバーについてAnsibleに通知します。 インベントリファイル(hosts
)で定義されたサーバーまたはサーバーのグループに対してプレイブックを実行できます。 私たちの在庫はとてもシンプルです。
hosts
を編集します:
nano ~/wordpress-ansible/hosts
[wordpress]
の行を追加し、その下にwordpress-serverのIPアドレスを追加します。
ホスト
[wordpress] wordpress_server_ip
[wordpress]
グループの下にさまざまなIPを配置できます。 これにより、すべてのサーバーでアクセスが設定されている場合、ここにリストされているすべてのサーバーでコマンドが実行されます。 これにより、WordPressを一度に複数の異なるサーバーにインストールできます。
プレイブック
プレイブックは、WordPressアプリの定義と考えることができます。 私たちのプレイブックは、私たちが作成した役割を組み合わせて、便利なアプリケーション(この場合はWordPressサイト)を構成します。
プレイブックファイルを編集します。
nano ~/wordpress-ansible/playbook.yml
これらのコンテンツを追加して、Ansibleにロールを実行するホスト(hosts
ファイル内のwordpress
ホスト)と実行するロールを指示します。
playbook.yml
- hosts: wordpress roles: - server - php - mysql - wordpress
プレイブックディレクトリに移動します。
cd ~/wordpress-ansible/
プレイブックを実行して、build-serverからwordpress-serverへの基本的な接続が機能することを確認しましょう。 まだ何もしません。 接続をテストするだけです。
ansible-playbook playbook.yml -i hosts -u sammy -K
プロンプトが表示されたら、wordpress-serverでsudoユーザーのsudoパスワードを入力します。
次のような出力が表示されます。
Outputansible-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
ロールを編集します。
サーバーの役割は、必要なすべてのソフトウェアをターゲットサーバーにインストールします。 このファイルを編集します。
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を手動でインストールする方法のチュートリアルをご覧ください。
これで、次のようにプレイブックを実行できます。
ansible-playbook playbook.yml -i hosts -u sammy -K
次のような出力が表示されます。
Outputansible-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のメインタスクファイルを編集します。
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
ファイル内の任意の変数のデフォルト値を指定できます。
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
データベースを作成するタスクとそれにアクセスするユーザーを追加します。
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
ファイルにいくつかの異なるタスクを追加しているので、このセクションのために開いたままにしておきます。
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
を開いて編集します。
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_NAME
、DB_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をインストールして構成します。
ansible-playbook playbook.yml -i hosts -u sammy -K
http://your_server_ip
でWordPressサイトをオンラインで表示できるはずです。
ここから手動でWordPressサイトのセットアップを完了することができます。
結論
おめでとう! これで、1つのコマンドで任意のUbuntu14.04サーバーにWordPressサイトをインストールできます。
ansible-playbook playbook.yml -i hosts -u sammy -K
ターゲットサーバーのIPアドレスをhosts
ファイルに追加し、アクセス許可が正しく設定されていることを確認するだけです。
次のステップ
これは、AnsibleとWordPressを使い始めるための非常に簡単なイントロでした。 次の改善点を調べることに興味があるかもしれません。
- Ansible Galaxyを探索し、Galaxyで独自の役割をホストする方法を学びます
- セットアッププロセスを自動化して、WordPressサイトを手動で構成する必要がないようにします