概要
- 前回導入したwpーcliを使ってWordPressのメンテナンスを自動化する。
- 自動化にあたってはsystemdのTimerを利用する
serviceファイルの要件
今回の要件は以下の通り
- 毎日実行されること。
- wp-cli自体の更新を先に行うこと。
- core,plugin,themeの更新を行うこと。
これらのことにもとづいて構成していく。
まず、本体はrootの持ち物であるためここだけ別のサービスに切り出す。
次にWordPress自体を更新する部分であるが、ここはApatchに実行させる。
ここからは実際にservice ファイルを作成していく。
Service ファイルの作成
以前に、systemdについてまとめた記事があるためそれを踏まえながら書いていく。
wp-cliの更新
rootに実行させるためシンプルに書いていくことができる。
以下のようにした。
/etc/systemd/system/wpcli-update.service
[Unit]
Description= wp-cli auto updating tool
Requires=network.target[Service]
ExecStart=/usr/bin/wpcli cli update
Type=oneshot
service等を追加、変更した場合はこれをsystemdに通知する必要があるため以下のコマンドを実行する。
# systemctl daemon-reload
次に実行してみて正しく動作しているかを確かめる
# systemctl start wpcli-update.service
# systemctl status wpcli-update.service
● wpcli-update.service – wp-cli auto updating tool
Loaded: loaded (/etc/systemd/system/wpcli-update.service; static; vendor preset: disabled)
Active: inactive (dead)
Apr 16 00:35:09 hoge systemd[1]: Starting wp-cli auto updating tool…
Apr 16 00:35:11 hoge wpcli[17427]: Success: WP-CLI is at the latest version.
Apr 16 00:35:11 hoge systemd[1]: Started wp-cli auto updating tool.
これでこの部分は完成である。
WordPressの更新を実際に行う部分
ここでは複数の方法がかんがえられる。
まず1つ目は、shell scriptを呼び出す方法である。
これが一番作りやすくてメンテナンス性も良い。欠点としては他の場所にスクリプトを置く必要があるため管理する手間が増えることである。
2つ目は、ひとつのserviceに複数のExecStartを記述することである。この時の挙動はちょうどshellにおいて各コマンドを&&で繋いだ時と同じ挙動を示す。
3つ目は、それぞれのserviceファイルを用意しそれぞれ独立して設定することである。
本来であればこれが最も自然な状態であるが正直に言うと面倒くさい。
今回は2番の方式で作成していく。
1から作成するのは手間なので先ほど作成したserviceをコピーしてから編集する。
# cp /etc/systemd/system/wpcli-update.service /etc/systemd/system/wpUpdate.service
User=,Group=で指定することでその権限で動作することをふまえて以下のファイルとして作成する。
/etc/systemd/system/wpUpdate.service
[Unit]
Description= WordPress auto updating tool
Requires=network.target[Service]
ExecStart= /usr/bin/wpcli –path=/path/to/wpdir/ core update
ExecStart= /usr/bin/wpcli –path=/path/to/wpdir plugin update –all
ExecStart= /usr/bin/wpcli –path=/path/to/wpdir theme update –all
Type=oneshot
User=apache
Group=apache
ここでハマってしまったのがExecStart= の後ろにスペースを入れないと –path= の部分が渡らないことだった。
Timer ユニットの作成
ここまででServiceユニットの作成は完了した。
次はTimerユニットを作成していく。
やりたいことはubuntu のapt-dayli*.timer 系とだいたい同じなためこれを元にして作成する。
基本的にはTimerユニットはService名.timerとするのが基本なのでそれに習う。
また、ブログへのアクセスは0300(JST)~0500(JST)ぐらいが一番アクセスがないのでこの時間に更新させる。
wpcli本体の更新のTimer
Persistent=true
だと前の実行時刻を記録しておいて、次の正しい時刻に電源が切れているなどで実行できなかった場合にうまいこと実行してくれる機能である。
これは必ず OnCalendar と併用する必要がある。
下に実際に設定するユニットを示す。
/etc/systemd/system/wpcli-update.timer
[Unit]
Description=wpcli auto updateing tool timer[Timer]
OnCalendar=*-*-* 3:30
RandomizedDelaySec=30m
Persistent=true[Install]
WantedBy=timers.target
ユニットを作成したら再読込させて、Timerユニットを起動し、起動時に自動で立ち上がるように設定する。
systemctl daemon-reload
systemctl start wpcli-update.timer
systemctl enable wpcli-update.timer
WordPress更新のTimer
先ほど作成したファイルをコピーして必要なところだけ変更して使用する。
変更点は
- ユニットの説明
- 実行時間を0430にする
ことだけである。
まず、コピーする。
cp /etc/systemd/system/wpcli-update.timer /etc/systemd/system/wpUpdate.timer
次にこのファイルを編集し以下のようにした。
/etc/systemd/system/wpUpdate.timer
[Unit]
Description=WordPress auto updateing tool timer[Timer]
OnCalendar=*-*-* 5:00
RandomizedDelaySec=30m
Persistent=true[Install]
WantedBy=timers.target
これで完成したので先ほどと同じようにして有効化していく。
systemctl daemon-reload
systemctl start wpUpdate.timer
systemctl enable wpUpdate.timer
これでいちいち手動で更新する煩わしさから開放される。
まとめ
- service ユニットとtimerユニットによりいろいろなことが自動化できる。
- ExecStart= の後ろにスペースを入れないとなんかうまく行かないこと。
- Persistent=true は便利そう。
参考資料
systemd のman (man systemd.timer)
ubuntu 16.04 /lib/systemd/system/apt-daily-upgrade.timer
この前にまとめた記事