実践! AnsibleによるWordPress環境構築

2016年5月22日(日)
平原 一帆

本連載の第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の冒頭部分となります。

リスト1:作成する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
Playbook冒頭部分の解説

Playbook冒頭部分の解説

基本的な形は上記のとおりです。最初に環境を規定する「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部分から作成していきます。

リスト2:Playbookの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関連の部分について作成します。

リスト3:Playbookの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と同じディレクトリに置いておきます。そうでない場合は、パスの記述が必要となります。

リスト4:phpinfo.php

<?php
phpinfo();
?>

PHPの設定が終わった時点で「http://192.168.0.3/phpinfo.php」にアクセスすると、PHPのinfo画面が表示されます。これにより、ApacheとPHPの設定が正しく行われていることを確認できます。

MySQLに関する記述

続いて、MySQL部分について作成していきます。

リスト5:Playbookの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コマンドの実行が必要です。

リスト6: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部分について作成していきます。

リスト7:Playbookの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用の環境が構築されます。

リスト8:完成したwordpress.yml

---
- 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に示します。

リスト9:Playbook(wordpress.yml)の実行結果

[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の例を掲載します。

リスト10:完成版のPlaybook wordpress.modify.yml

---
- 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の米国およびその他の国における登録商標または商標です。
  • 本文中記載の会社名、商品名、ロゴは各社の商標、または登録商標です。
日立ソリューションズ
インフラ系OSSを中心に、新技術・新製品の組み合わせ評価及びソリューション開発支援に従事。現在は主にOSSクラウド技術の評価・情報展開を実施している。Open Standard Cloud Association (OSCA™)、OSSコンソーシアム クラウド部会などでも活動中。

連載バックナンバー

運用・管理技術解説
第10回

Ansible Towerのクラウド連携機能による効率化を目指す

2017/9/26
Ansible Towerが備えるクラウド連携機能を用いることで、Playbookやユーザーの管理を効率良く行えることを紹介する。
運用・管理技術解説
第9回

Ansible Towerによる権限の管理

2017/7/27
複数のユーザーによる使用を前提としたAnsible Towerでの権限管理の方法を紹介する。
運用・管理
第8回

Ansibleの機能を拡張するAnsible Tower

2017/4/18
好評の連載「注目の構成管理ツールAnsibleを徹底活用する」の追加コンテンツとして、Ansible Towerを取り上げる。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています