More than 1 year has passed since last update.

やっとAnsibleを仕事で使い始めました。
といっても、開発環境として、ですが。

今まで、WordPress案件の依頼を受けるたびに、開発環境を手作業で構築していました。
ローカルPC上にLAMP環境とか、安いレンタルサーバにファイルアップ&MySQLデータベース構築などなど、、、
公開前のWebサイトをお客さんに確認してもらうために、Basic認証設定を追加したり、
毎回必要な作業、煩わしいですね。

そのような作業を楽にするため、
Ansibleを使って、GCE(GoogleComputeEngine)のクラウドサーバ上に構築するように実装しました。
GCEでプロジェクトを作成しておけば、いくつでもWordPress環境を追加できます。
お仕事が捗りますねw

そんなPlaybookをgithubにアップしておきました。
:octocat: ansible-gce

  • 動作確認環境

    • OS X 10.10.5
    • Python 2.7.10
    • Ansible 1.9.4
    • Apache libcloud 0.20.0

初期設定については、
AnsibleでGCEインスタンスを管理する - Qiita
を参考にしてください。

以下のコマンドでインスタンスが生成され、いつでもWordPressの環境が手に入ります。

$ gce_ansible.sh gce_wordpress.yml

あとは、ブラウザを起動して、生成したインスタンスのIPアドレスにアクセスすれば、いつものWordPress開始画面が表示されます。
* Basic認証かかってます(初期設定は、ID:demo, PW:demopass)
* ID/PWの変更は、roles/wordpress/meta/main.yml を編集してください(後述)

ローカルPCで開発したソースコードをsftpでアップするもよし。
Gitをインストールしているので、git pushするもよし。<- :octocat: オススメ :thumbsup:

2つ目の環境が欲しいなら、/vars/target_wp.ymlで新しいインスタンス名を指定しましょう。

/vars/target_wp.yml
names: www-wp  <- インスタンス名

このPlaybookで実行していること

  • 生成したインスタンスのTimeZone & Locale設定
  • Gitインストール
  • Apacheインストール
  • Basic認証設定
  • MySQLインストール
  • Create Database
  • PHPインストール
  • WordPress(ja)最新版ダウンロード
  • wp-config.php設定

今回のポイント

  1. roleを使う
  2. dependenciesでWordPressに必要なroleを実行する
  3. role実行時に変数を渡して、roleの動作を制御する

1. roleを使う

roleは、Playbookのタスクを別ファイルに切り出して、再利用性を高める仕組みです。
rolesディレクトリを作成して、
roles/wordpress/tasks/main.yml
というファイルパスでタスクを記述していくと、
メインのPlaybook(今回でいうところのgce_wordpress.yml)からは

gce_wordpress.yml
roles:
  - wordpress

というセクションを記述することで呼び出すことができます。

2. dependenciesでWordPressに必要なroleを実行する

WordPressを使うには、ApacheやMySQL、PHPのインストールが必要になりますが、
Playbookで各々を指示する必要はありません。

roles/wordpress/meta/main.yml
というファイルを作成して、dependenciesセクションを記述することで
Ansibleが、WordPressのタスクを実行する前に、dependenciesセクションの各roleを実行してくれます。

roles/wordpress/meta/main.yml
dependencies:
  - { role: apache,
      basic_auth_name: "demo",
      basic_auth_pass: "demopass"
    }
  - { role: mysql,
      mysql_db_name: "wordpress",
      mysql_db_user: "wpuser",
      mysql_db_password: "wppass1234"
    }
  - { role: php }

メインのPlaybook側はシンプルになりますし、別のPlaybookでも再利用しやすく、可搬性が高まりますね。

3. role実行時に変数を渡して、roleの動作を制御する

前述のdependenciesセクションに必要なのは、roleセクションだけですが、
role: apache の後に basic_auth_namebasic_auth_passというセクションが続いています。
これらは apacheroleに渡す変数を記述しています。

今回作成したApacheインストール用role roles/apache/meta/main.yml には、
Basic認証を設定するタスクを記述しています。
そのために必要な ID/PW の値を渡しています。

もし、dependenciesの中でbasic_auth_namebasic_auth_passを指定せず
- {role: apache}
という記述だけにした場合、
純粋にApacheのインストールしか行わなず、Basic認証無しのWordPress環境が構築されます。
(Apacheインストール用role側で変数の指定有無をチェックしています)

同様にMySQLインストール用roleも、
変数に応じてWordPressに必要なデータベースを作成します。
(MySQL向けの変数を削除してしまうと、WordPressが動かないので注意!)

参考

あとは、
開発作業後に、本番へ移行する際もこんな調子でいきたいですね。