KusanagiとWP-CLIを使った出来るだけ楽なWordPress設置

#はじめに
こんにちは。アドベントカレンダーもいよいよ大詰めとなって来ましたね。
ということで、本日は、KusanagiとWP-CLIを使ってできるだけ楽にサーバーを設置する方法を考えていきたいと思います。
WordPressの設置は、素直にやるとGUIでの操作が多いのですが、今回はできるだけCLI上の操作で完結する方針でいきます！

#やりたかったこと
インフラ業務をやっている中で全く同じWordPress環境を大量に設置する事がありました。
そうすると、プラグインのインストールや設定を毎回行うのが面倒になってきます。（同じなのだから自動化したい）
GUIのインターフェイスからほとんどのことを出来ることがWordPressの売りなのでしょうが、
設置する側からすると、そのせいでプラグインの設定など自動化しにくい部分もあります。
今回は、Kusanagi環境を前提として、設置をCLI上で完全自動化する方法を検討しました。

#結論
やりたいことは、CLIだけで完結するWordPressの設置ですが、設置済みWordPressのDBダンプからWordPressのクローンを作ることで目的を達成しました。
以下の流れで設置することで、自動化しにくかったプラグインやテーマの設定も自動化する事ができます。

```
1. １台目のWordPressの設置＆設定を行う
2. 設定完了後のDBのダンプを保存しておく
3. ２台目以降は、保存しておいたDBのダンプを使用してWordPressの設置する　→　１台目の設定が引き継がれる
4. 変更が必要なもののみ設定を上書きする
```


#前提条件
- CentOS7.x or AmazonLinux
- Kusanagi
- WP-CLI
- Mysql

今回は１つのEC２インスタンスに複数のWordPressを設置する方針で話を進めていきます。


#EC2の起動
AMIにて`KUSANAGI for AWS (WordPress)`を選択し、あとは通常通りEC２インスタンスを作成する流れでポチポチやっていく。（尺の都合上EC2の設置に関しては省略させてください）
インスタンスタイプは、とりあえず`t2.micro`とかでいいと思います。
![スクリーンショット 2018-12-23 16.23.47.png](https://qiita-image-store.s3.amazonaws.com/0/259725/9798a000-faba-4166-45dc-e5ae758ebefb.png)


#KUSANAGI の初期設定
作成が完了したら、 設置したサーバーに`ssh`でログインします。

```
[user@~/]$ ssh centos@13.230.xxx.xxx -i

Last login: Sun Dec 23 16:30:11 2018 from 555-21-test-vv.aa.xxx.ap.plala.or.jp

     __ ____  _______ ___    _   _____   __________
    / //_/ / / / ___//   |  / | / /   | / ____/  _/
   / ,< / / / /\__ \/ /| | /  |/ / /| |/ / __ / /
  / /| / /_/ /___/ / ___ |/ /|  / ___ / /_/ // /
 /_/ |_\____//____/_/  |_/_/ |_/_/  |_\____/___/

    Version 8.4.2-1, Powered by Prime Strategy.

[centos@kusanagi80 ~]$ 
```

ログインが出来たら、Kusanagiの初期設定を行います。

```
[centos@kusanagi80 ~]$ kusanagi init

KUSANAGIのバージョンをチェックしています。
KUSANAGIの最新バージョンをご使用いただき、ありがとうございます。
certbot-auto のアップデートを確認します。
certbot 0.29.1

Search or select timezone:  Asia/Tokyo   #リストの中からAsia/Tokyoを入力                                                                                                                                                                                                                                IgnoreCase [1/1]
Asia/Tokyo                             


Select your using language.
1 : English
2 : 日本語
q : quit
Which are you using?: 2 #日本語を選択

ご使用中のキーボードレイアウトを選択してください。
1: 英語
2: 日本語
q : 終了
Which are you using?:　2 #こちらも日本語を選択

ユーザー kusanagi のパスワードを変更。
新しいパスワード: #Passrowdを入力

KUSANAGIはミドルウェアを選択することができます。
Webサーバーを選択してください
1) NGINX(デフォルト)
2) Apache

どれを使用しますか?(1): 1 #今回はNginxを選択。

アプリケーションサーバを選択してください。
1) PHP7(デフォルト)
2) HHVM
3) PHP5

どれを使用しますか?(1):　#今回はPHP7を選択

Rubyのバージョンを選択して下さい。
1) Ruby2.4

どれを使用しますか?(1):　1 #今回はRuby2.4を選択

データベースシステムを選択してください。
1) MariaDB(デフォルト)
2) PostgreSQL

どれを使用しますか?(1): 1 #今回はMariaDBを選択

MySQLのrootパスワードを入力してください。[a-zA-Z0-9.!#%+_-]の文字列が使用できます。最小は8文字以上です。　# 新規Passwordを入力
再度MySQLのrootパスワードを入力してください。　# 再度Passwordを入力
パスワードは変更されました。
MySQLのrootパスワードを変更しました。

〜〜〜〜途中省略〜〜〜〜〜

KUSANAGIの初期設定を完了しました。
完了しました。
```

#1台目のWordPressの設置
クローンする元となるWordPressを設定していきます。プラグイン＆テーマの設定以外はCLIから行います。

### KUSANAGI Provision
KUSANAGIにて新しいWordPressを設置する場合は、`kusanagi provison`　コマンドを実行します。
この時、オプションを何も指定しなかったら対話型の入力となります。
今回は、自動化を前提としてるので、全ての必須オプションを設定しておきます。


```
kusanagi provision --WordPress \
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--wplang ja \
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--dbname <DB名> \
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--dbuser <DBユーザー名> \
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--dbpass <DBパスワード> \
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--email <メールアドレス> \
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　--fqdn <サイトのURL> \
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<プロファイル名> ;

例：　
[centos@kusanagi80 ~]$ sudo kusanagi provision --WordPress --wplang ja --dbname db_test --dbuser user_test --dbpass db_password123 --email test@example.com --fqdn test.example.com wp_test;

wp_test のプロビジョニングは完了しました。test.example.com にアクセスし、WordPressをインストールしてください!
完了しました。
```

この状態では、ディレクトリ`/home/kusanagi/<プロファイル名>/` が作成され、`/home/kusanagi/<プロファイル名>/DocumentRoot/`内にWordPressのファイルが保存されています。 
MariaDB,Nginxの設定は終わっていますが、WordPressの設定（普段Webから行うような設定）をこれから行っていきます。

### wp-config.phpの作成
まずは`wp-config.php`の作成です。
`kusanagi provision`をしたときと同じ設定値を入力していきます。

```
[centos@kusanagi80 ~]$ sudo -u kusanagi -- /usr/local/bin/wp config create --dbname=<DB名> --dbuser=<DBユーザー名> --dbpass=<DBパスワード>　--path=/home/kusanagi/<プロファイル名>/DocumentRoot/`
Success: Generated 'wp-config.php' file.
```

### WordPressのインストール実行
これで`wp-config.php`が作成されたので、次は　WordPressのインストールを行います。

```
[centos@kusanagi80 ~]$ sudo -u kusanagi -- /usr/local/bin/wp core install --url='<サイトのURL>' --title='<サイトのタイトル>' --admin_name='<WordPress管理画面のログインユーザー名>' --admin_password='<WordPress管理画面のログインパスワード>' --admin_email='<メールアドレス>'
Success: WordPress installed successfully.
```

これで、URLにアクセスしたら、WordPressが立ち上がっていると思います。ここまでで基本的な初期設定は完了です。

### プラグイン＆テーマのインストール

```
### プラグイン ###
[centos@kusanagi80 ~]$ sudo -u kusanagi -- /usr/local/bin/wp plugin install <プラグインのディレクトリ名>　# iThemeSecurityの場合はbetter-wp-security
Installing iThemes Security (formerly Better WordPress Security) (7.2.0)
Downloading installation package from https://downloads.wordpress.org/plugin/better-wp-security.7.2.0.zip...
Unpacking the package...
Installing the plugin...
Plugin installed successfully.
Success: Installed 1 of 1 plugins.

[centos@kusanagi80 ~]$ sudo -u kusanagi -- /usr/local/bin/wp plugin activate <プラグインのディレクトリ名>　# これで有効化される 
Success: Activated 1 of 1 plugins.


### テーマ ###
[centos@kusanagi80 ~]$ sudo -u kusanagi -- /usr/local/bin/wp theme install <テーマのディレクトリ名>　# twentysixteen など
Installing Certify (1.2.4.1)
Downloading installation package from https://downloads.wordpress.org/theme/certify.1.2.4.1.zip...
Unpacking the package...
Installing the theme...
This theme requires a parent theme. Checking if it is installed...
Preparing to install SpicePress 1.5.4...
Downloading installation package from https://downloads.wordpress.org/theme/spicepress.1.5.4.zip...
Unpacking the package...
Installing the theme...
Theme installed successfully.
Theme installed successfully.
Success: Installed 1 of 1 themes.

[centos@kusanagi80 ~]$ sudo -u kusanagi -- /usr/local/bin/wp theme activate <プラグインのディレクトリ名>　# これで有効化される 
Success: Switched to 'Twenty Sixteen' theme.
```

### プラグイン＆テーマの設定
ここは、はじめの一回は手動でやることになるので、必要な設定を管理画面から行ってください。


#２台目以降の設置
１台目で設定したものと同じ設定がされているWordPressを別のサイトをとして作成します。
WordPressは基本的にすべての設定をDatabase上に保持してます。
したがって、ほとんどの場合はDatabaseのデータの中身をコピーすることで、再度設定しなくても１台目と同じWordPressを作る事ができます。


### Databaseのダンプを保存
設定が完了したWordPressのDatabaseのDumpを保存しておく。

```
[centos@kusanagi80 ~]$ mysqldump -u <DBユーザー名> -p<DBパスワード> -h localhost > wp_test_db.dump
```

### KUSANAGI Provision
１台目の設置と同じです。（ID＆PASSなどの設定値だけは変更してください）

### wp-config.phpの作成
ここも１台目の設置と同じです。（ID＆PASSなどの設定値だけは変更してください）

### ~~WordPressのインストール実行~~ DBダンプの復元
ここでは、WordPressのインストール処理を行わずに、先程保存した、１台目WordPressのDBダンプを復元します。

```
# 既存のテーブルがあったらすべて削除
[centos@kusanagi80 ~]$ mysql -N -e "SHOW TABLES FROM <DB名>" | xargs -I "@@" mysql -e "DROP TABLE <DB名>.\`@@\`"
# DBダンプの復元
[centos@kusanagi80 ~]$ mysql <DB名> < "<ダンプファイル名>"
```

### WordPressの設定を変更(１台目の設定を上書きする)

```
#WordPress管理画面パスワードの変更(ユーザー名は同じものを使い回す想定)
[centos@kusanagi80 ~]$ sudo -u kusanagi -- /usr/local/bin/wp user update <WordPressログインユーザー名> --user_pass=<新WordPressログインパスワード>

#ホスト名の変更
[centos@kusanagi80 ~]$ kusanagi setting --fqdn <新サイトURL> <新プロファイル名>

#サイト名の変更
[centos@kusanagi80 ~]$ mysql -uroot -e "use <新DB名> ; update wp_options set option_value='<新サイト名>' where option_name='blogname';"

#SSL証明書の再取得
[centos@kusanagi80 ~]$ kusanagi ssl --email <新メールアドレス> <新プロファイル名>
```


### プラグイン＆テーマのインストール
１台目の設置と同じです。
ここでは、それぞれのファイルをダウンロードする必要があるため再度行う必要があります。

### プラグイン＆テーマの設定
１台目WordPressのDBダンプを使用したためスキップ出来ます。


# まとめ
これらの処理をうまくシェルスクリプトにしてあげることで、２台目以降はほんの１~２分で同じ環境のWordPressを作成することが出来るようになります。
特に、GUIでの設定は抜け漏れが発生しやすかったりするため、一度行った設定を引き継げるのはとても嬉しいです。
　＃この方法はプラグインに大幅なアップデートがあったりする場合は、予期せぬ不具合を招くことにもなるかもしれないので、その際はしっかりテストを行う必要があるとは思います。

他にも色々な工夫を行いながら、業務の効率化を図っています。
これからも面倒なことはシェルスクリプトにおまかせしていけるよう、様々な工夫を行っていこうとおもいます。