Ansible でバックアップのシェルスクリプトを配置してみる

ファイル群とDBのエクスポートデータを .tar.gz で固めて FTP で別マシンに退避するバックアップ用のシェルスクリプトを Ansible で設定できないか、と考えました。

前提

  • 環境:
    • Web・DBサーバ(1台): 192.0.2.1
    • バックアップ用サーバ(1台): 192.0.2.2

環境としては同一ネットワーク上に上記の2つのサーバがいるものとします。

処理フロー

今回のスクリプトのフローです。

  1. Web・DBサーバ内で cron から毎日決められた時刻に「特定ディレクトリ /etc/cms_backup_script/ 直下にある .sh(Webサイトごとに存在、例えば www.example.jp_backup.sh) を実行
  2. www.example.jp_backup.sh で以下の処理を実行
    1. MySQLのサイトで使用しているデータベースをエクスポートし、 .gz で固めて /home/cms_bkup/www.example.jp/content/ に設置
    2. Webサイトの仮想サイトのドキュメントルート配下のファイル・ディレクトリを .tar.gz で固めて /home/cms_bkup/www.example.jp/mysql/ に設置
    3. 1.,2.のファイルを含む /home/cms_bkup/www.example.jp/ ディレクトリを .tar で固めて /tmp/ ディレクトリに設置
    4. FTPクライアントで www.example.jp_backup.ftp を処理
      1. バックアップ用サーバにFTPログイン
      2. 指定ディレクトリへ移動
      3. 上記3.で固めた .tar ファイルの過去分がディレクトリに存在する場合は削除
      4. 今回上記3.で固めた .tar ファイルをアップロード
    5. /tmp/, /home/cms_bkup/www.example.jp/content/, /home/cms_bkup/www.example.jp/mysql/ の3つのディレクトリのファイルを削除

以上のようなフローになっています。

スクリプト設置手順 (これまで)

これらのスクリプトを設置する際に、今までは以下のような手順を実施していました。

  • ベース:
    1. mkdir /home/cms_bkup
    2. mkdir /etc/cms_backup_script
    3. vi /etc/crontab
      • ii hh * * * ADMIN_USER run-parts /etc/cms_backup_script のような形で毎日決められた時刻に /etc/cms_backup_script/ 下に存在するシェルスクリプトを実行するように cron に登録
  • サイト毎:
    1. mkdir /home/cms_bkup/www.example.jp/
    2. mkdir /home/cms_bkup/www.example.jp/content/
    3. mkdir /home/cms_bkup/www.example.jp/mysql/
    4. vi /etc/cms_backup_script/www.example.jp_backup.sh
      • サイト毎にスクリプトの内容を修正
    5. vi /etc/cms_backup_script/www.example.jp_backup.ftp
      • サイト毎にスクリプトの内容を修正

流石にサイト毎のスクリプト修正は面倒過ぎるので、途中からWebフォームで必要な情報を入力するとスクリプトを自動生成してくれるようなフォーム・ジェネレータを作りました。

が、それすらも面倒臭くなってきたので、 Ansible でできないか、と。

Ansible プレイブック

ということで作りました。

ディレクトリ構造

PROJECT_ROOT/
  ├ workspace/                              // データ永続化領域
  │    ├ entrypoint.sh                      // Dockerコンテナ起動時に実行するシェルスクリプト
  │    └ ansible/                           // Ansible 用ディレクトリ
  │         ├ targets/                      // リモートホストの情報を収めるディレクトリ
  │         │    └ hosts                    // リモートサーバの一覧 (今回は1つのみ)
  │         │
  │         ├ tasks/                        // Ansible のタスクを収めるディレクトリ
  │         │    ├ add_backup_ftp.yml       // FTPスクリプトの設置
  │         │    ├ add_backup_shell.yml     // シェルスクリプトの設置
  │         │    ├ init_backup.yml          // バックアップ領域のディレクトリを掘る (ディレクトリが存在しない場合のみ)
  │         │    ├ init_cron.yml            // /etc/crontab を加筆
  │         │    ├ init_script.yml          // バックアップスクリプト用のディレクトリを掘る (ディレクトリが存在しない場合のみ)
  │         │    └ mkdir_backup.yml         // サイトごとのバックアップ領域のディレクトリを掘る
  │         │
  │         ├ templates/                    // バックアップスクリプトのテンプレートを収めるディレクトリ
  │         │    ├ backup.ftp.j2            // FTPスクリプトのテンプレート
  │         │    └ backup.sh.j2             // シェルスクリプトのテンプレート
  │         │
  │         ├ vars/                         // 各種パラメータ変数の設定を収めるディレクトリ
  │         │    └ param_vars.yml           // 各種パラメータ変数
  │         │
  │         └ main.yml                      // Ansible の playbook
  │
  ├ docker-compose.yml                      // Docker Compose 設定ファイル
  └ Dockerfile                              // Dockerfile

Dockerfile, docker-compose.yml, entrypoint.sh. ansible/targets/hosts

この辺りはそのまま。

ansible/vars/param_vars.yml

commons:
  scriptrootpath: /etc/cms_backup_script/
  bkuprootpath: /home/cms_bkup/
site:
  domain: www.sample.jp
  rootdirectory: sample_site
  subdirectory:
cmstools:
  toolname: wp
  usedb: true
db:
  dbname: exampledb
  dbuser: johndoe
  dbpassword: DBDummyPassword1234
ftp:
  ftpserver: 192.0.2.2
  ftppath: /ftp/backup/
  ftpuser: johndoe
  ftppassword: FtpDummyPassword1234

必要そうなパラメータを入れました。今回はパラメータが多いのでネストした配列の形式です。

特に cmstools.usedb でツールがDBを使っているかどうかのフラグを持たせており、これによりバックアップスクリプトにDBのエクスポートを含めるか否かをテンプレートの中で条件分岐させています。

ansible/main.yml

- name: Settings cms tools backup

  become: yes
  become_user: ADMIN_USER
  become_method: su

  hosts:
    - add_vhost_servers

  vars_files: ./vars/param_vars.yml

  tasks:
    - name: check and mkdir script root
      include_tasks: ./tasks/init_script.yml
      vars:
        commonsparam: "{{ commons }}"
    - name: Settings crontab
      include_tasks: ./tasks/init_cron.yml
      vars:
        commonsparam: "{{ commons }}"
    - name: check and mkdir bkuproot
      include_tasks: ./tasks/init_backup.yml
      vars:
        commonsparam: "{{ commons }}"
    - name: mkdir backup for a site
      include_tasks: ./tasks/mkdir_backup.yml
      vars:
        commonsparam: "{{ commons }}"
        siteparam: "{{ site }}"
        cmstoolsparam: "{{ cmstools }}"
    - name: Deploy backup Shellscript
      include_tasks: ./tasks/add_backup_shell.yml
      vars:
        commonsparam: "{{ commons }}"
        siteparam: "{{ site }}"
        cmstoolsparam: "{{ cmstools }}"
        dbparam: "{{ db }}"
    - name: Deploy backup FTP command
      include_tasks: ./tasks/add_backup_ftp.yml
      vars:
        siteparam: "{{ site }}"
        cmstoolsparam: "{{ cmstools }}"
        ftpparam: "{{ ftp }}"

ansible/tasks/add_backup_ftp.yml

- name: Deploy backup FTP command
  template:
    src: ../templates/backup.ftp.j2
    dest: "{{ commons.scriptrootpath }}{{ site.domain }}_backup.ftp"
    mode: '0400'

FTPスクリプトをテンプレートから生成するタスク。

ansible/tasks/add_backup_shell.yml

- name: Deploy backup Shellscript
  template:
    src: ../templates/backup.sh.j2
    dest: "{{ commons.scriptrootpath }}{{ site.domain }}_backup.sh"
    mode: '0700'

シェルスクリプトをテンプレートから生成するタスク。

ansible/tasks/init_backup.yml

- name: bkuproot directory check
  stat:
    path: "{{ commons.bkuprootpath }}"
  register: chk_dir
- name: mkdir bkuproot
  file:
    path: "{{ commons.bkuprootpath }}"
    state: directory
    owner: ADMIN_USER
    group: ADMIN_USER
    mode: 0755
    recurse: no
  when: chk_dir.stat.exists == false

バックアップ領域のディレクトリを掘るタスク。

今回の新しい部分はディレクトリが存在しない場合のみ実施するように when で条件分岐しているところ。また、ディレクトリの存在チェックのために、 register: chk_dir を利用しています。

ansible/tasks/init_cron.yml

- name: Settings crontab
  blockinfile:
    path: /etc/crontab
    create: no
    insertafter: EOF
    marker: "# {mark} ANSIBLE basic setup: cms tools backup"
    block: "ii hh * * * ADMIN_USER run-parts {{ commons.scriptrootpath }}"

/etc/crontab のファイル末尾にジョブを加筆するタスク。前回は marker をユニークにしましたが、今回は逆に意図的に marker を固定にすることで、ジョブが重複して登録されないようにしました。

ansible/tasks/init_script.yml

- name: scriptroot directory check
  stat:
    path: "{{ commons.scriptrootpath }}"
  register: chk_dir
- name: mkdir script root
  file:
    path: "{{ commons.scriptrootpath }}"
    state: directory
    owner: ADMIN_USER
    group: ADMIN_USER
    mode: 0755
    recurse: no
  when: chk_dir.stat.exists == false

ansible/tasks/init_backup.yml と内容は同じです。

ansible/tasks/mkdir_backup.yml

- name: mkdir backup for a site
  file:
    path: "{{ commons.bkuprootpath }}{{ site.rootdirectory }}"
    state: directory
    owner: ADMIN_USER
    group: ADMIN_USER
    mode: 0755
    recurse: no
- name: mkdir backup for a site contents
  file:
    path: "{{ commons.bkuprootpath }}{{ site.rootdirectory }}/content/"
    state: directory
    owner: ADMIN_USER
    group: ADMIN_USER
    mode: 0755
    recurse: no
- name: mkdir backup for a site db
  file:
    path: "{{ commons.bkuprootpath }}{{ site.rootdirectory }}/mysql/"
    state: directory
    owner: ADMIN_USER
    group: ADMIN_USER
    mode: 0755
    recurse: no
  when: cmstools.usedb | bool

サイトごとのバックアップ領域のディレクトリを掘るタスク。ここでは cmstools.usedb の値によってDB用のディレクトリを掘るか否かを when で条件分岐しています。

準備

検証のため、以下の2つのサイトを作成します。

  1. WordPress
    • ファイル群・DB(SQLエクスポート)含めて WordPress 全体をバックアップ
  2. 自前ツールで JSON の新着情報を管理するサイト
    • JSON ファイル配置フォルダをバックアップ

準備には折角なので以前作ったプレイブックを使います。

A. サイト作成

5.A.1. WordPress

param_vars.yml

username: johndoe
password: DummyPassword1234
rootdirectory: example
domain: www.example.jp
ipaddress: 192.0.2.1
portnum: 80

まずはこうして……

プレイブック実行

# ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/main.yml -u SSH_REMOTEUSER --private-key="/root/.ssh/PRIVATE_KEY" -K
BECOME password: 

PLAY [Settings vsftpd and httpd] **********************************************************************************
TASK [Gathering Facts] ********************************************************************************************ok: [192.0.2.1]

TASK [Add Linux User] *********************************************************************************************included: /workspace/ansible/tasks/add_user.yml for 192.0.2.1

TASK [Add user, setting password and groups] **********************************************************************changed: [192.0.2.1]

TASK [Settings vsftpd user_list and user_conf] ********************************************************************included: /workspace/ansible/tasks/vsftpd_user_settings.yml for 192.0.2.1

TASK [Settings vsftpd user_list] **********************************************************************************changed: [192.0.2.1]

TASK [Settings vsftpd user_conf] **********************************************************************************changed: [192.0.2.1]

TASK [Restart vsftpd] *********************************************************************************************changed: [192.0.2.1]

TASK [Setup Apache conffile] **************************************************************************************included: /workspace/ansible/tasks/apache_settings.yml for 192.0.2.1

TASK [mkdir root] *************************************************************************************************changed: [192.0.2.1]

TASK [mkdir web] **************************************************************************************************changed: [192.0.2.1]

TASK [Setup Apache conffile] **************************************************************************************changed: [192.0.2.1]

TASK [Restart httpd] **********************************************************************************************changed: [192.0.2.1]

PLAY RECAP ********************************************************************************************************192.0.2.1                 : ok=12   changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

OK。

5.A.2. 自前ツールサイト

param_vars.yml

username: janedoe
password: DummyPassword5678
rootdirectory: json_example
domain: json.example.jp
ipaddress: 192.0.2.1
portnum: 80

同様にパラメータを設定。

プレイブック実行

# ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/main.yml -u SSH_REMOTEUSER --private-key="/root/.ssh/PRIVATE_KEY" -K
BECOME password: 

PLAY [Settings vsftpd and httpd] **********************************************************************************
TASK [Gathering Facts] ********************************************************************************************ok: [192.0.2.1]

TASK [Add Linux User] *********************************************************************************************included: /workspace/ansible/tasks/add_user.yml for 192.0.2.1

TASK [Add user, setting password and groups] **********************************************************************changed: [192.0.2.1]

TASK [Settings vsftpd user_list and user_conf] ********************************************************************included: /workspace/ansible/tasks/vsftpd_user_settings.yml for 192.0.2.1

TASK [Settings vsftpd user_list] **********************************************************************************changed: [192.0.2.1]

TASK [Settings vsftpd user_conf] **********************************************************************************changed: [192.0.2.1]

TASK [Restart vsftpd] *********************************************************************************************changed: [192.0.2.1]

TASK [Setup Apache conffile] **************************************************************************************included: /workspace/ansible/tasks/apache_settings.yml for 192.0.2.1

TASK [mkdir root] *************************************************************************************************changed: [192.0.2.1]

TASK [mkdir web] **************************************************************************************************changed: [192.0.2.1]

TASK [Setup Apache conffile] **************************************************************************************changed: [192.0.2.1]

TASK [Restart httpd] **********************************************************************************************changed: [192.0.2.1]

PLAY RECAP ********************************************************************************************************192.0.2.1                 : ok=12   changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

こちらもOK。

B. サイト作成

5.B.1. WordPress

DB作成

WordPress 用にDB作成。

  • DB名: exampledb
  • ユーザ: johndoe
  • パスワード: DBDummyPassword1234

DB権限設定

  • 対象DB: exampledb
  • ユーザ: johndoe
  • ホスト、権限

以上 Webmin から設定。

WordPress インストール

普通にインストール・ログインして以下を実施。

  • テーマ変更
  • プラグインインストール
  • 設定変更
  • サンプルコンテンツ・画像など投入

WordPressのサンプルサイト
WordPressのサンプルサイト

2. 自前ツールサイト

自前ツール設定し、 news.json 作成。

data/news.json

[
    {
        "title": "Scarsick",
        "date":  "2020/07/08",
        "description": "His skin against this dirty floor.",
        "link": ""
    },
    {
        "title": "Spitfall",
        "date":  "2020/07/17",
        "description": "Introducing Star, Thus Quote The Craving, Redefining Vomatorium, Man Of The Masses, YO",
        "link": ""
    },
    {
        "title": "Cribcaged",
        "date":  "2020/05/06",
        "description": "",
        "link": ""
    },
    // 略
]

これで必要なファイル群を準備2.の情報でデプロイ。

自前ツールサイトのサンプルサイト
自前ツールサイトのサンプルサイト

JSON からリストが生成されていることを確認。

検証

ようやく本題です。

冒頭で取り上げたバックアップスクリプトの設定をしてみようと思います。

6.1. WordPress

cmstools.usedb の値によってバックアップスクリプトの内容が変化することを確認しておきます。

param_vars.yml

commons:
  scriptrootpath: /etc/cms_backup_script/
  bkuprootpath: /home/cms_bkup/
site:
  domain: www.sample.jp
  rootdirectory: sample_site
  subdirectory:
cmstools:
  toolname: wp
  usedb: true
db:
  dbname: exampledb
  dbuser: johndoe
  dbpassword: DBDummyPassword1234
ftp:
  ftpserver: 192.0.2.2
  ftppath: /ftp/backup/
  ftpuser: johndoe
  ftppassword: FtpDummyPassword1234

まずはこうして……

プレイブック実行

# ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/main.yml -u SSH_REMOTEUSER --private-key="/root/.ssh/PRIVATE_KEY" -K
BECOME password: 

PLAY [Settings cms tools backup] **********************************************************************************
TASK [Gathering Facts] ********************************************************************************************ok: [192.0.2.1]

TASK [check and mkdir script root] ********************************************************************************included: /workspace/ansible/tasks/init_script.yml for 192.0.2.1

TASK [scriptroot directory check] *********************************************************************************ok: [192.0.2.1]

TASK [mkdir script root] ******************************************************************************************changed: [192.0.2.1]

TASK [Settings crontab] *******************************************************************************************included: /workspace/ansible/tasks/init_cron.yml for 192.0.2.1

TASK [Settings crontab] *******************************************************************************************changed: [192.0.2.1]

TASK [check and mkdir bkuproot] ***********************************************************************************included: /workspace/ansible/tasks/init_backup.yml for 192.0.2.1

TASK [bkuproot directory check] ***********************************************************************************ok: [192.0.2.1]

TASK [mkdir bkuproot] *********************************************************************************************changed: [192.0.2.1]

TASK [mkdir backup for a site] ************************************************************************************included: /workspace/ansible/tasks/mkdir_backup.yml for 192.0.2.1

TASK [mkdir backup for a site] ************************************************************************************changed: [192.0.2.1]

TASK [mkdir backup for a site contents] ***************************************************************************changed: [192.0.2.1]

TASK [mkdir backup for a site db] *********************************************************************************changed: [192.0.2.1]

TASK [Deploy backup Shellscript] **********************************************************************************included: /workspace/ansible/tasks/add_backup_shell.yml for 192.0.2.1

TASK [Deploy backup Shellscript] **********************************************************************************changed: [192.0.2.1]

TASK [Deploy backup FTP command] **********************************************************************************included: /workspace/ansible/tasks/add_backup_ftp.yml for 192.0.2.1

TASK [Deploy backup FTP command] **********************************************************************************changed: [192.0.2.1]

PLAY RECAP ********************************************************************************************************192.0.2.1                 : ok=17   changed=8    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0 

OK。

結果確認

cron

# less /etc/crontab

## 略

# BEGIN ANSIBLE basic setup: cms tools backup
ii hh * * * ADMIN_USER run-parts /etc/cms_backup_script/
# END ANSIBLE basic setup: cms tools backup

ジョブが登録されていることを確認。

sh, ftp

# ls -al /etc/cms_backup_script/
-r--------  1 ADMIN_USER ADMIN_USER YYYY mm dd hh:ii www.example.jp_backup.ftp
-rwx------  1 ADMIN_USER ADMIN_USER ZZZZ mm dd hh:ii www.example.jp_backup.sh

きちんと生成されていますね、OKです。

中身も問題ないことを確認。

バックアップディレクトリ

# ls -al /home/cms_bkup/
drwxr-xr-x  4 ADMIN_USER ADMIN_USER AAAA mm dd hh:ii example

# ls -al /home/cms_bkup/example/
drwxr-xr-x  2 ADMIN_USER ADMIN_USER BBBB mm dd hh:ii content
drwxr-xr-x  2 ADMIN_USER ADMIN_USER BBBB mm dd hh:ii mysql

ディレクトリも作成されています。

6.2. 自前ツールサイト

今度はDBを使用しない自前ツールサイトの方を試します。 cmstools.usedb の値に応じて .sh が変化することや、既存ディレクトリの中身がクリーンされない、といった点を確認したいと思います。

param_vars.yml

commons:
  scriptrootpath: /etc/cms_backup_script/
  bkuprootpath: /home/cms_bkup/
site:
  domain: json.example.jp
  rootdirectory: json_example
  subdirectory: jsontools/data/
cmstools:
  toolname: jsontools
  usedb: false
db:
  dbname: exampledb
  dbuser: johndoe
  dbpassword: DBDummyPassword1234
ftp:
  ftpserver: 192.0.2.2
  ftppath: /ftp/backup/
  ftpuser: johndoe
  ftppassword: FtpDummyPassword1234

usedb: false としてDB使用しないことを宣言。なので db: 以下の値はダミーです。

プレイブック実行

# ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/main.yml -u SSH_REMOTEUSER --private-key="/root/.ssh/PRIVATE_KEY" -K        
BECOME password: 

PLAY [Settings cms tools backup] **********************************************************************************
TASK [Gathering Facts] ********************************************************************************************ok: [192.0.2.1]

TASK [check and mkdir script root] ********************************************************************************included: /workspace/ansible/tasks/init_script.yml for 192.0.2.1

TASK [scriptroot directory check] *********************************************************************************ok: [192.0.2.1]

TASK [mkdir script root] ******************************************************************************************skipping: [192.0.2.1]

TASK [Settings crontab] *******************************************************************************************included: /workspace/ansible/tasks/init_cron.yml for 192.0.2.1

TASK [Settings crontab] *******************************************************************************************ok: [192.0.2.1]

TASK [check and mkdir bkuproot] ***********************************************************************************included: /workspace/ansible/tasks/init_backup.yml for 192.0.2.1

TASK [bkuproot directory check] ***********************************************************************************ok: [192.0.2.1]

TASK [mkdir bkuproot] *********************************************************************************************skipping: [192.0.2.1]

TASK [mkdir backup for a site] ************************************************************************************included: /workspace/ansible/tasks/mkdir_backup.yml for 192.0.2.1

TASK [mkdir backup for a site] ************************************************************************************changed: [192.0.2.1]

TASK [mkdir backup for a site contents] ***************************************************************************changed: [192.0.2.1]

TASK [mkdir backup for a site db] *********************************************************************************skipping: [192.0.2.1]

TASK [Deploy backup Shellscript] **********************************************************************************included: /workspace/ansible/tasks/add_backup_shell.yml for 192.0.2.1

TASK [Deploy backup Shellscript] **********************************************************************************changed: [192.0.2.1]

TASK [Deploy backup FTP command] **********************************************************************************included: /workspace/ansible/tasks/add_backup_ftp.yml for 192.0.2.1

TASK [Deploy backup FTP command] **********************************************************************************changed: [192.0.2.1]

PLAY RECAP ********************************************************************************************************192.0.2.1                 : ok=14   changed=4    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0 

OK。

結果確認

cron

# less /etc/crontab

## 略

# BEGIN ANSIBLE basic setup: cms tools backup
ii hh * * * ADMIN_USER run-parts /etc/cms_backup_script/
# END ANSIBLE basic setup: cms tools backup

marker を意図的に重複するようにしたので、同じジョブが二重登録されていないことを確認。

sh, ftp

# ls -al /etc/cms_backup_script/
-r--------  1 ADMIN_USER ADMIN_USER WWWW mm dd hh:ii json.example.jp_backup.ftp
-rwx------  1 ADMIN_USER ADMIN_USER XXXX mm dd hh:ii json.example.jp_backup.sh
-r--------  1 ADMIN_USER ADMIN_USER YYYY mm dd hh:ii www.example.jp_backup.ftp
-rwx------  1 ADMIN_USER ADMIN_USER ZZZZ mm dd hh:ii www.example.jp_backup.sh

ディレクトリはクリーニングされず、既存設定は生きています。OKです。

json.example.jp_backup.sh の中身もDB部分が削れていることを確認。

バックアップディレクトリ

# ls -al /home/cms_bkup/
drwxr-xr-x  3 ADMIN_USER ADMIN_USER AAAA mm dd hh:ii json_example
drwxr-xr-x  4 ADMIN_USER ADMIN_USER AAAA mm dd hh:ii example

# ls -al /home/cms_bkup/json_example/
drwxr-xr-x  2 ADMIN_USER ADMIN_USER BBBB mm dd hh:ii content

こちらもOKです。DB用のディレクトリは作成されていません。

ジョブ試験

さて、ここまでで設定的には大丈夫そうな感じですが、本当に意図通りに動くのかどうか cronジョブ で確かめます。

vi /etc/crontab でジョブの実行時間をずらして処理させてみます。

結果

192.0.2.2 のバックアップサーバにファイルが転送されたことを確認した後、それらのファイルをローカルにコピーしてきて解凍してみます。

8.1. WordPress

www.example.jp のバックアップファイルを解凍したフォルダ
www.example.jp のバックアップファイルを解凍したフォルダ

www.example.jp のバックアップファイルを解凍したフォルダ。 contentmysql の2つのフォルダができています。

エクスポートされたSQLデータ
エクスポートされたSQLデータ

ダンプされたSQL文に先ほど入力したサンプル記事が入っていることを確認。

WordPress のファイル群がそのままバックアップ
WordPress のファイル群がそのままバックアップ

WordPress のファイル群がそのままバックアップできていることを確認。

wp-content/uploads の中身
wp-content/uploads の中身

wp-content/uploads の中身も問題ありません。OKです。

8.2. 自前ツールサイト

json.example.jp のバックアップファイルを解凍したフォルダ
json.example.jp のバックアップファイルを解凍したフォルダ

こちらも問題なさそうです。

用意した JSONデータ が入っていることを確認
用意した JSONデータ が入っていることを確認

用意した JSONデータ が入っていることを確認。OKです。

検証結果

検証した結果、意図した通りの挙動になることが確認できました。

今まではジェネレータで生成していたとはいえ、生成したものを vi で流すなど、まだ多少の人間によるオペレーションが残っていました。

今回の Ansibleプレイブック により、それらすらも param_vars.yml にパラメータを記述すれば後は全て自動化できるようになりました。

IaC、良いですね。

参考

Ansible

ファイル・ディレクトリの存在チェック

when

jinja2

三項演算子

正確には三項演算子ではなく inline if-expressions 。

Dry run

--check をオプションに指定すると可。

Error: the connection plugin ‘heck’ was not found

check オプションはハイフン2つ。

Warning: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}

自分の場合は when: "{{ cmstools.usedb | bool }}" と書いていたのを when: cmstools.usedb | bool に修正して警告を回避した。

(未使用) cron

tar

この記事を書いた人

アバター

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。