CI Provisioner

AnsibleでWordPress環境を構築する

AnsibleでWordPressの動作環境を構築するplaybookを書きました。
Ansibleが2.0系になってからしっかりとつかっていなかったのと、今使っているVPSで稼働しているOSがCentOS6系ということもあり、そろそろCentOS7系にアップデートするときにの動作検証に使おうかなと思って作りました。
ansible galaxyから探せばよかったんですけど、今回は自分で書きました。

GitHub beeete2/wp-install

基本的な方針としてソースからのビルドは行わずにyumでパッケージインストールすることにしました。
動作検証用といってもなるべく本番環境に合わせたほうがよいと思うのでApache等のミドルウェアの設定はデフォルトではなくてある程度は設定を変更しています。
マルチプラットフォームには対応せずに素直にパッケージをインストールするので設定ファイル等はデフォルトの場所をymlにベタ書きしてあります。
汎用性は・・・ほぼないです。

動作環境

・CentOS 7
・Apache 2.4
・MariaDB 5.5
・PHP 7.1

ロールの一覧

標準設定

・ロールに依存しないパッケージを指定してインストールする
・タイムゾーンを設定できる
・ロケールを設定できる
・selinuxを設定できる

Apache

・バーチャルホスト(ssl)を複数定義できる
・バーチャルホストごとにsslサーバー証明書を設定できる
・基本設定に加えてバーチャルホストごとに設定を追記できる

MariaDB(MySQL)

・MySQL rootユーザーのパスワードを変更できる(emptyパスワードにはできない)
・データベースを作成することができる
・MySQLユーザーを作成することができる

PHP

・remiレポジトリからphp7.1をインストールする

chrony

・インストール時にデフォルト設定されているserverをコメントアウトする
・任意のserverを追加できる

migration

・WordPressのバックアップファイルを指定されたディレクトリへ解凍することができる
・MySQLのダンプファイルを指定されたDBへ展開することができる

使い方

Vagrant上で動かすことを想定してますので、デフォルトのホストはlocalhostになっています。
[bash]
### Ansibleをインストールする
sudo yum -y install epel-release
sudo yum -y install ansible

### playbookをダウンロードする
sudo yum -y install git
git clone https://github.com/beeete2/wp-install.git
cd wp-install

### MySQLのパスワード等を変更する(パスワードは例)
tee vars/private.yml <<EOF
mariadb_root_password: "test"
mariadb_default_user_password: "test"
EOF

### 実行する
ansible-playbook setup.yml

### おまけ(wordpress-jaをインストールする)
ansible-playbook install.yml
[/bash]

注意点

MySQL rootユーザーのパスワード変更

普通パッケージインストールした直後にmysql_secure_installationを実行すると思うのですがAnsibleからだと対話形式はできないことはないんでしょうけど、なかなか難しそうだったので諦めました。
mysql_secure_installation自体はシェルスクリプトなので、ここに書いてあることをplaybookで実行することにしました。
主に実行していることは
・MySQL rootユーザーのパスワード変更とリモートログインの禁止
・匿名ユーザー(anonymous)の削除
・テストデータベースの削除
のようでした。

実はこのMySQLのrootユーザーの初期パスワードを変更したか?という状態をどのように検知して冪等性を確保するか少し悩みました。
rootユーザーの初期パスワード状態を検知する方法を考えました。すぐに思いついたのは2案。
1.パスワードを変更したファイルを作って、そのファイルがない場合はパスワードを変更する
2.パスワードがemptyの場合はパスワードを変更する
1の方法は確実なのですがサーバーに状態を残すことになるので今回は見送って、2の方法で構築しました。
2の方法はパスワードがempty状態でないとセットアップが継続できないことになるのですが、仕組みとしては単純なのでこちらにしました。
手順としては以下になります。
(1)rootユーザーにパスワードなしでログインできるか検証
(2)ログインできる場合はrootパスワードを変更する
(3)rootユーザーの.my.cnfを配置する(パスワードを設定しておく)
ここは、もう少しいいやり方があったら改善します。

まとめ

Ansibleは1.x系のとき触っていたのですが2.0系になって更に便利になっていました。
実際に体感できる部分ではblockがすごい便利だったしincludeも思い通りの動きをしてくれたのですごい便利になったなーという感じでした。
1.x系のときのincludeはループに変数を使えなかった印象があります(怪しい)

参考にさせていただいたページ

MySQLパフォーマンスチューニング -my.cnfの見直し-
Ansible Role: Apache 2.x
Ansibleチュートリアル 2017

-CI, Provisioner
-

© 2025 ビー鉄のブログ Powered by AFFINGER5