CI Provisioner

AnsibleでWordPress環境を構築する

投稿日:2017/05/13 更新日:

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になっています。

### 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

注意点

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
-

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

ChefでBerksを実行してOracle Javaをインストール

Chefでは、自分でレシピを書く以外でもコミュニティクックブックを利用することができるみたいです。 Apacheはもちろんかなりたくさんのクックブックがあり、Javaもありました。 というわけで、この …

Windowsでberksコマンドを実行すると発生するエラーの対応

先日インストールしたBerkshelfですが、実行するとエラーが発生しました。 エラー内容は取っていないのですが、ChefにバンドルされているRubyがSSLの証明書を見つけられないような感じでした。 …

no image

Jenkinsの管理画面で「URLがUTF-8でデコード・・・」みたいな警告が表示される場合の対応方法

クソ長いタイトルの通りなのですが、Tomcat上で動作している、Jenkinsの管理画面で 「URLがUTF-8でデコードされていません。ジョブ名などにnon-ASCIIな文字を使用する場合は、コンテ …

no image

JenkinsでiOSアプリをビルドする手順

先日、@ITの記事で、「グリーはいかにしてJenkinsを導入したのか」という記事が掲載されておりました。 この中に、Mac上のJenkinsでiOSアプリをビルドする方法について記載がありました。 …

AnsibleでZabbixSever3.0の環境を構築する

最近、何のブログかわからなくなってきておりますが、久々のAnsibleネタです。 AnsibleでZabbixServer3.0を構築するPlaybookを書きました。 playbook-zabbix …