カテゴリー
WordPress

BackWPup から WordPress をサーバ構成も含めて復元する Ansible プレイブックを作った時の勉強ノート

BackWPup – WordPress Backup Plugin | WordPress.org でファイルとデータベースのバックアップを Zip ファイルにして DropBox にアップロードすることを、日々自動実行しております。

このファイルをダウンロードして、これを元にサーバ環境も含めて復元する Ansible プレイブックを作成しました。

サーバに障害が起きたときや、サーバを引っ越ししたいときは、バックアップファイルとプレイブックを実行すれば復元できるようになります (正確には、SSL/TLS 証明書発行はできてませんのでまだ未完成ですけれども)。

その中で、気がついたことをメモいたします。

Ansible の unarchive モジュール

unarchive モジュールを使って次のようにしました。

  • {{ bacwpup_zip_file }} は BackWPup で作成したバックアップファイル名。
  • {{ wp_path }} は WordPress の配置ディレクトリ。/srv/wordpress/
- name: Extract BackWPup
  unarchive:
    src: "{{ bacwpup_zip_file }}"
    dest: "{{ wp_path }}"

最終的には上記のようになりましたけれども、本当は DropBox から直接ダウンロードして WordPress の配置ディレクトリへと展開したかった のです。

- name: Extract BackWPup
  unarchive:
    src: "{{ bacwpup_zip_file_url }}"
    dest: "{{ wp_path }}"
    remote_src: yes

こんな感じにすればよいはずのですけれども、エラーとなってしまいました。。。 ドキュメントを読みますとシンプルな URL の場合はこれで行けるそうです。DropBox で URL を共有してもダメでしたので、これはシンプルなパターンではないようですね。。。

If remote_src=yes and src contains ://, the remote machine will download the file from the URL first. (version_added 2.0). This is only for simple cases, for full download support use the get_url module.

念の為 Ansible バージョンを確認すると、問題なさそうです。

$ ansible --version
ansible 2.5.5
  config file = /home/vagrant/playbook/ansible.cfg
  configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
$

WP-CLI で wp-config.php の内容を取得

できるんでしょうか、、、できるんですね!!!と驚いたのがこちらでした。特に、データベースのパスワードを普通に取得できました。

これで Ansible の引数ファイルにデータベースの情報を一切記述すること無く復元ができるようになりました♪大変嬉しく思います。

# wp config get DB_NAME
wp_db_name
# wp config get DB_USER
wp_db_user
# wp config get DB_PASSWORD
chage_here
#

Ansible プレイブックに記述するときは次のようになりました。

  • WP-CLI
    • wp コマンドを使用するときはフルパスで指定
    • --path オプションをつけることで実行場所に依存しないようにした。
  • register
    • register で指定した値に wp config get で取得した内容が入る。
    • register に入れた値は、オブジェクトのため、変数.stdout などで値を取得する。
- name: Get WordPress database name
  shell: /usr/local/bin/wp config get DB_NAME --path={{ wp_path }}
  register: wp_db_name
  changed_when: false
  failed_when: false

... 略 ...

- name: Create WordPress database
  mysql_db:
    name: "{{ wp_db_name.stdout }}"
    state: present

WP-CLI でデータベースにインポート

を参考にしました。次のように Ansible プレイブックを作成しました。

  • wp-config.php のデータベース接続情報を使用してインポートするため、別途指定する必要が無く、楽!
  • Ansible プレイブックを 2 回目以降実行しても、エラーにはならず、バックアップの SQL ファイルでデータベースの内容を上書きする。
- name: Import WordPress DataBase
  shell: /usr/local/bin/wp db import {{ wp_path }}/{{ wp_db_name.stdout }}.sql --path={{ wp_path }}

できなかったこと

  • WP-CLI でデータベースを作成しようとしたが、エラーとなってしまったため諦めた。
    • wp-config.php のデータベース情報を元にデータベースを作成しようとするのだが、データベース情報のユーザはまだ未作成な状態なので当然の結果ではある。
    • データベースの作成、ユーザ作成とそのパスワード設定は、Ansible の mysql_db、mysql_user モジュールで行った。

おわりに

残るは Certbot 系のプレイブックの作成となります。

Ansible role としてありそうですけれども、内容によってはコマンドに近い形になるかとも考えています。

気軽にサーバを移る事のできるように、早くなりたいものですね♪

以上です。

コメントを残す