実践! AnsibleによるWordPress環境構築
本連載の第2回、第3回では、Ansible基礎編と題してAnsbileの導入方法や簡単な使い方について詳しく解説していきます。第2回では、AnsibleのインストールとAnsibleの簡単なコマンド、Playbookについて紹介しました。今回は、WordPress環境の構築を題材にしながら、Ansible Playbookの作成の基本となる、変数の扱いや頻出のモジュールについて紹介します。
WordPressはオープンソースのブログ/CMSプラットフォームで、ブログやWebページの作成のために、広く使われているソフトウェアです。WordPressを利用するためには、Apache、PHP、MySQLのインストールが必要となります。これらのインストールに必要な手順を全て Playbookに記述し、ansible-playbookコマンドを実行するだけでWordPressを利用できるようにしていきます。
前提環境について
環境は前回と同様です。Ansible実行サーバーと、操作対象サーバーの2台にそれぞれCentOS 7.2がインストールされており、外部ネットワークとAnsible管理ネットワークを設定しています。
Ansible Playbookの書き方の基本
Playbookには様々な書き方があります。本稿では最も基本的な書き方として、1つのPlaybookにWordPressを構築する全ての手順を記述する方法を紹介します(大規模な環境を構築する際などには、複数のPlaybookを連携させることが多いです)。Playbookの書き方の方針としては、Ansible公式サイトにあるIntro to Playbooksのページをご参照ください。
Intro to Playbooks - Ansible Documentation
http://docs.ansible.com/ansible/playbooks_intro.html
本稿でも上記に沿った形でPlaybookを記述します。まずは基本的な形について解説します。以下は、WordPress作成のためのPlaybookの冒頭部分となります。
--- - hosts: wordpress vars: wordpress_url: https://ja.wordpress.org/wordpress-4.4.2-ja.tar.gz remote_user: user become: yes tasks: - name: apache(httpd)のインストール yum: name=httpd state=latest
基本的な形は上記のとおりです。最初に環境を規定する「hosts」や「vars」などを指定して、「tasks」以降に処理を記述していきます。
「vars」で指定しているのは変数です。環境やユーザーによって異なる値が必要となる場合のために、Playbookの冒頭で設定しています。今回のPlaybookでは、WordPressのダウンロード先となるURLの指定に変数を利用しています。これは、バージョンアップなどによりダウンロード先URLが変更されることがあるためです。他には、ユーザー名やパスワードなど、環境に応じて異なる値を入れる場合などに設定しておくと便利です。
「remote_user」では、操作対象のサーバー上で処理を実行するユーザー名を指定しています。rootユーザーであれば全ての処理が可能ですが、rootを使用できない環境などでは、「remote_user」で一般ユーザーを指定し、「become=yes」でsudo権限を指定する必要があります。
Playbookを書く際には、動作させたい処理を正しく把握した上で落としこんでいく必要があります。例えば、WordPressをインストールするためには、前提としてApache、PHP、MySQLのインストールと諸設定が必要となるため、その手順を明確にしておく必要があります。今回の例である「WordPressが動作する環境」を構築するためには、下記の表1のような処理が必要となります。
必要な処理 | 具体的な手順 |
---|---|
Apacheの導入 | httpdのyumインストール firewallの設定 httpdサービスの起動 |
PHPの導入 | phpのyumインストール タイムゾーンの設定 テストページの作成 httpdサービスの再起動 |
MySQLの導入 | MySQLのyumインストール MySQLサービスの起動/ |
WordPressの導入 | WordPressのダウンロード WordPressの展開 WordPressの所有権の変更 httpdサービスの再起動 |
これらの処理について、それぞれAnsibleのコードとして記述していきます。Ansibleは、Playbookに記述された処理を上から順に実行していくため、実行していきたい順に処理を記述していきます。似たような処理をまとめることもできますが、本稿ではPlaybookの理解のため、まずは上から順に必要な処理を記述していきます。
Apacheに関する記述
まず、Apache部分から作成していきます。
- name: Apache(httpd)のインストール yum: name=httpd state=latest - name: firewalldでHTTPを許可 firewalld: permanent=True service=http state=enabled immediate=true - name: サービスの起動 service: name=httpd state=started enabled=yes
yumによるhttpd(パッケージ名)のインストールを行った後、http接続のためにfirewallの設定を行っています。最後に、httpdサービスを起動して、Apacheの導入は完了です。
PHPに関する記述
次に、PHP関連の部分について作成します。
- name: PHPのインストール yum: name="{{item}}" state=latest with_items: - php - php-mysql - name: タイムゾーンの設定 ini_file: > dest=/etc/php.ini section=Date option=date.timezone value='"Asia/Tokyo"' - name: phpテストページの作成 copy: > src=phpinfo.php dest=/var/www/html/phpinfo.php - name: httpサービスの再起動 service: name=httpd state=restarted enabled=yes
PHPの構築では、yumモジュールによるphpインストール、serviceモジュールによるhttpdの再起動のほか、ini_fileモジュールによるファイルの編集と、copyモジュールによる外部にあるファイルのコピーを実施しています。
yumモジュールでは、「name="{{item}}"」として変数を置き、「with_items:」を用いて複数のインストール対象を並列しています。こうした書式により、一度に複数の対象を列挙することができます。
ini_fileモジュールは、操作対象サーバー上の指定したini形式のファイルの内容を書き換えます。「dest=」で指定したファイルに含まれる、「section=」で指定したセクションの、「opsion=」で指定した設定項目を、「value=」で指定した値に変更します。今回は、タイムゾーンの指定をAsia/Tokyoに変更しています。
ファイル書き換えのコマンドとしては、今回のようなiniファイルにはini_fileモジュールが利用可能です。そのほかには、lineinfileモジュールやreplaceモジュールがよく利用されます。lineinfileは複雑な条件の行指定が可能ですが、複数行の置換に対応していません。一方replaceモジュールは、複数行の置換が可能ですが、複雑な条件の行指定ができません。編集したいファイルに適した選択が必要です。
copyモジュールは、Ansible実行サーバーから操作対象サーバーへファイルのコピーを行います。「src=」で指定したファイルを、「dset=」で指定した先へコピーします。「src=」で指定するファイルはPlaybookと同じディレクトリに置いておきます。そうでない場合は、パスの記述が必要となります。
<?php phpinfo(); ?>
PHPの設定が終わった時点で「http://192.168.0.3/phpinfo.php」にアクセスすると、PHPのinfo画面が表示されます。これにより、ApacheとPHPの設定が正しく行われていることを確認できます。
MySQLに関する記述
続いて、MySQL部分について作成していきます。
- name: MariaDBインストール yum: name="{{item}}" state=latest with_items: - mariadb - mariadb-server - MySQL-python - name: サービスの起動 service: name=mariadb state=started enabled=yes
MySQLの構築では、MariaDB関連のyumインストールと、mariadbサービスの起動を行っています(CentOS 7.0以降ではMySQLではなくMariaDBの利用が推奨されているため、本稿ではMariaDBを用いています)。
WordPress利用のためには、MySQL上でデータベースを作成する必要があります。この作業もAnsible上から実行可能ですが、今回は説明の都合上、省略しています。実際に本Playbookを用いてWordPressを利用する場合は、別途操作対象サーバー上で下記のmysqlコマンドの実行が必要です。
※操作対象サーバー上で実行 #mysql -u root mysql> update mysql.user set password=password('任意のパスワード') where user = 'root'; mysql> flush privileges; mysql> exit; # mysql -u root -p mysql> create database wordpress; mysql> grant all privileges on wordpress.* to wordpressp@localhost identified by '任意のパスワード';
WordPressに関する記述
最後に、WordPress部分について作成していきます。
- name: wordpressのダウンロード get_url: url="{{ wordpress_url }}" dest=/tmp/wordpress.tar.gz - name: wordpressの展開 unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/html/ copy=no - name: wordpressの所有権をapacheに変更 file: path=/var/www/html/wordpress/ owner=apache group=apache recurse=yes - name: httpサービスの再起動 service: name=httpd state=restarted
WordPressの構築では、WordPressパッケージのダウンロードとパッケージの展開、所有権の変更を行い、httpdサービスを再起動しています。
WordPressはApacheなどのインストールと異なり、yumインストールではなく、get_urlモジュールでWordPressのパッケージのあるWordPress.orgからダウンロードを行っています。ダウンロード先は「url=」で指定したURLとなりますが、バージョンアップなどにより変更の可能性があるため、冒頭で指定した「"{{ wordpress_url }}"」として変数を用いています。ダウンロードしたファイルは「dset=」で指定したディレクトリに保存します。
unarchiveモジュールでは、ダウンロードしてきたtar.gz形式の圧縮ファイルを、「dset=」で指定したディレクトリに展開しています。「copy=no」の場合、今回のように操作対象サーバーにあるファイルを展開しますが、「copy=yes」の場合、Ansible実行サーバーにあるファイルを展開します。
fileモジュールは、「path=」で指定したファイルやディレクトリの属性を変更します。様々な変更が行えますが、今回は「owner=」と「group=」を用いて所有権を変更しています。「recurse=yes」により、wordpress/以下のファイルとディレクトリに再帰的に所有権の変更を行っています。
以上で、WordPressを構築するための準備が整いました。ここまで1ステップごとに作成してきたPlaybookをひとつにまとめたファイルwordpress.ymlをリスト8に示します。wordpress.ymlを実行することで、WordPress用の環境が構築されます。
--- - name: wordpress環境構築 hosts: wordpress remote_user: user become: yes vars: wordpress_url: https://ja.wordpress.org/wordpress-4.4.2-ja.tar.gz tasks: - name: Apache(httpd)のインストール yum: name=httpd state=latest - name: firewalldでHTTPを許可 firewalld: permanent=True service=http state=enabled immediate=true - name: サービスの起動 service: name=httpd state=started enabled=yes - name: PHPのインストール yum: name="{{item}}" state=latest with_items: - php - php-mysql - name: タイムゾーンの設定 ini_file: > dest=/etc/php.ini section=Date option=date.timezone value='"Asia/Tokyo"' - name: phpテストページの作成 copy: > src=roles/phpinfo.php dest=/var/www/html/phpinfo.php - name: httpサービスの再起動 service: name=httpd state=restarted enabled=yes - name: MariaDBインストール yum: name="{{item}}" state=latest with_items: - mariadb - mariadb-server - MySQL-python - name: サービスの起動 service: name=mariadb state=started enabled=yes - name: wordpressのダウンロード get_url: url="{{ wordpress_url }}" dest=/tmp/wordpress.tar.gz - name: wordpressの展開 unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/html/ copy=no - name: wordpressの所有権をapacheに変更 file: path=/var/www/html/wordpress/ owner=apache group=apache recurse=yes - name: httpサービスの起動 service: name=httpd state=restarted
wordpress.ymlを実行した結果を、下記リスト9に示します。
[root@ansible2 wordpress-ansible]# ansible-playbook wordpress.yml PLAY [wordpress環境構築] **************************************************** TASK [setup] ***************************************************************** ok: [192.168.0.3] TASK [Apache(httpd)のインストール] ******************************************* changed: [192.168.0.3] TASK [firewalldでHTTPを許可] *********************************************** changed: [192.168.0.3] TASK [サービスの起動] ******************************************************** changed: [192.168.0.3] TASK [PHPのインストール] *************************************************** changed: [192.168.0.3] => (item=[u'php', u'php-mysql']) TASK [タイムゾーンの設定] **************************************************** changed: [192.168.0.3] TASK [phpテストページの作成] ************************************************ changed: [192.168.0.3] TASK [httpサービスの再起動] ************************************************** changed: [192.168.0.3] TASK [MariaDBインストール] ************************************************* changed: [192.168.0.3] => (item=[u'mariadb', u'mariadb-server', u'MySQL-python']) TASK [サービスの起動] ******************************************************** changed: [192.168.0.3] TASK [wordpressのダウンロード] ********************************************** changed: [192.168.0.3] TASK [wordpressの展開] ******************************************* changed: [192.168.0.3] TASK [wordpressの所有権をapacheに変更] ************************** changed: [192.168.0.3] TASK [httpサービスの再起動] ***************************************** changed: [192.168.0.3] PLAY RECAP ***************************************************************** 192.168.0.3 : ok=14 changed=13 unreachable=0 failed=0
Playbookの正常動作を確認後、「http://192.168.0.3/wordpress」にアクセスし、「WordPressへようこそ。」のページを確認します。ページが正しく表示され、MySQLで設定したデータベース名、ユーザー名などを入力することでWordPressが利用可能となります。
以上により、WordPress環境を構築するPlaybook(wordpress.yml)が完成しました。これでWordPress自体は動作するようになりましたが、yumインストールやサービスの起動/再起動の部分などは集約が可能です。実行結果は同じですが、冗長性を減らし可読性を高めることで、より使いやすいPlaybookとなります。リスト10に、修正したPlaybookの例を掲載します。
--- - name: wordpress環境構築 hosts: wordpress remote_user: user become: yes vars: wordpress_url: https://ja.wordpress.org/wordpress-4.4.2-ja.tar.gz tasks: - name: 必要パッケージのyumインストール yum: name="{{item}}" state=latest with_items: - php - php-mysql - httpd - mariadb - mariadb-server - MySQL-python - name: firewalldでHTTPを許可 firewalld: permanent=True service=http state=enabled immediate=true - name: wordpressのダウンロード get_url: url="{{ wordpress_url }}" dest=/tmp/wordpress.tar.gz - name: タイムゾーンの設定 ini_file: > dest=/etc/php.ini section=Date option=date.timezone value='"Asia/Tokyo"' - name: wordpressの展開 unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/html/ copy=no - name: wordpressの所有権をapacheに変更 file: path=/var/www/html/wordpress/ owner=apache group=apache recurse=yes - name: 各種サービスの再起動 service: name="{{item}}" state=started enabled=yes with_items: - mariadb - httpd
yum install部分の集約と、serviceの起動部分の集約が主な変更点となります。その他、phpinfoページの作成を省略しています。これ以外にも、serviceの起動をhandlerに任せることなどの変更も可能です。詳しくは下記をご参照ください。
Intro to Playbooks - Ansible Documentation
http://docs.ansible.com/ansible/playbooks_intro.html
次回以降の予定
今回はWordPress環境の構築を題材にしながら、Ansible Playbookの作成の基本となる、変数の扱いや頻出のモジュールについて紹介しました。
次回以降は、Ansible応用編と題して、複数ホストや複数アプリケーションを扱う場合の書き方やTipsについてご紹介する予定です。
- Ansibleは、米国Red Hat, Inc. の米国およびその他の国における登録商標もしくは商標です。
- WordPressは、WordPress Foundationの米国およびその他の国における登録商標または商標です。
- 本文中記載の会社名、商品名、ロゴは各社の商標、または登録商標です。