Ansible と wp-cli で WordPress の構築を自動化してみた話

1日遅れてしまいましたが Ansible と wp-cli で WordPress の構築を自動化してみた話を書きます。

WordPress って良くも悪くも気軽に管理画面で設定を変えたりプラグインをインストールできてしまいます。簡単なのでついつい管理画面でオペレーションが完結していまいがちですが、誰が作ったプラグインかわからないものを気軽に本番環境に入れるのは怖いです。特にサイトのデータがぶっ壊れたときに売上に影響するようなものだと。

本当に求めているプラグインなのかどうか使ってみないとわからないこともあるし、じゃあテスト環境みたいなのと本番環境みたいなのを作ってテスト環境で動作検証してから本番環境で使おうという発想になってくるわけですが、

    • そもそもテスト環境を作らず本番だけで運用している人って多いのでは?

 

    • 作ってても本番環境と入っているプラグインに差異があり、プラグイン間の相性などの検証ができずテスト環境の意味が半減しているのでは?

 

    複数 WordPress のサイトを持っている人は、インストール、設定、いつも決まったプラグインを入れて……と同じことを繰り返しているのでは?

在运营方面可能还有改进的空间。因此,在之前的 Advent Calendar 中,我提到过使用 wp-cli 和 Ansible 进行结合来尝试构建。

私は WordPress 初心者なので、一般的にどんな感じで構築しているのかよくわかっていなくてオレオレな感じですが、たとえばさくらのレンタルサーバにテスト環境と本番環境を構築する想定で Ansible Playbook を書いてみました。 SSH 接続で入れることが必須なので、スタンダードプラン以上で使えます。

例如,我会这样定义。

---
envs:
  staging:
    wp_cli_dir: ~/www/bin
    wordpress_dir: ~/www/staging
    mysql_dbname: '{{ ansible_ssh_user }}_wp_staging'
    mysql_dbuser: '{{ ansible_ssh_user }}'
    mysql_dbpass: dbpassword
    mysql_dbhost: mysqlXXX.db.sakura.ne.jp
    url: http://example.com/
    title: WordPress 練習サイト
    admin_user: youcune
    admin_password: adminpassword
    admin_email: admin@example.com
  production:
    wp_cli_dir: ~/www/bin
    wordpress_dir: ~/www/production
    mysql_dbname: '{{ ansible_ssh_user }}_wp_production'
    mysql_dbuser: '{{ ansible_ssh_user }}'
    mysql_dbpass: dbpassword
    mysql_dbhost: mysqlXXX.db.sakura.ne.jp
    url: http://stg.example.com/
    title: WordPress 練習サイト
    admin_user: youcune
    admin_password: adminpassword
    admin_email: admin@example.com
---
- file: path={{ envs[env].wp_cli_dir }} state=directory
- get_url: url=https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
    dest={{ envs[env].wp_cli_dir }}/wp validate_certs=no mode=0755
- file: path={{ envs[env].wordpress_dir }} state=directory
- shell: '{{ envs[env].wp_cli_dir }}/wp core download --locale=ja'
    chdir={{ envs[env].wordpress_dir }} creates={{ envs[env].wordpress_dir }}/index.php
- shell: '{{ envs[env].wp_cli_dir }}/wp core config --dbname={{ envs[env].mysql_dbname }} --dbuser={{ envs[env].mysql_dbuser }} --dbpass={{ envs[env].mysql_dbpass }} --dbhost={{ envs[env].mysql_dbhost }}'
    chdir={{ envs[env].wordpress_dir }} creates={{ envs[env].wordpress_dir }}/wp-config.php
- shell: '{{ envs[env].wp_cli_dir }}/wp core install --url={{ envs[env].url }} --title="{{ envs[env].title }}" --admin_user={{ envs[env].admin_user }} --admin_password={{ envs[env].admin_password }} --admin_email={{ envs[env].admin_email }}'
    chdir={{ envs[env].wordpress_dir }}

当构建测试环境时,

$ ansible-playbook -i hosts sites.yml --extra-vars env=staging --ask-vault-pass

在搭建生产环境时,

$ ansible-playbook -i hosts sites.yml --extra-vars env=production --ask-vault-pass

のように指定します。プラグインなど追加したいときは roles/install/tasks/main.yml に書き、まずテスト環境での動作を確認してから env を切り替えて同様の内容を本番環境に乗せるという運用にしてみようと思います(wp-cli は wp-cli plugin install したときにプラグインがすでにインストールされている場合も終了コード 0 になるようなので、 Ansible 上でエラーハンドリングを考慮しなくても良さそうです)。 Ansible Playbook の全文は GitHub にあげました。

如果您有更好的想法或者通常都采用这种方式,请务必在评论中告诉我。

bannerAds