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でTomcatをバイナリインストールする(とりあえず動いた編)

先日の記事に引き続き、ChefでTomcatをバイナリインストールする練習です。 取り急ぎ、先日の記事でなんとなくのレシピの骨子になるようなものを書きました。 今回は、具体的にレシピを書いて行ってとり …

Jenkinsでビルド実行時に確認を行う方法

Jenkins便利ですねー。 ビルドボタン一発で処理が実行されますからね。 しかしながら、中には実行が怖いビルドもありますよね・・・。 例えば、本番サーバーで運用しているアプリケーションへのデプロイと …

no image

JenkinsにiOSアプリビルド用のプラグイン追加方法

今回は、JenkinsにiOSアプリをビルドするためのプラグインをインストールしてみたいと思います。 Jenkinsのインストールは終わっているものと仮定します。 Jenkinsプラグインのインストー …

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

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

Chef実践入門を買ってみた

昨年くらいからChefやDevOpsという言葉をよく耳にする機会があって、Chefはすごい便利そうだなーと色々なホームページを見て自分の環境に導入してみたが実際の業務に使えるというほど深く触れなかった …