Ansible AWX のバックアップ

#<font color="DarkOrange">目次</font>
<ul>
<li><a href="#1-%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">1. はじめに</a></li>
<li><a href="#2-tower-cli-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">2. tower-cliインストール</a></li>
<li><a href="#3-tower-cli%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95">3. tower-cli使用方法</a></li>
<li><a href="#4-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88">4. オブジェクトのエクスポート</a></li>
<li><a href="#5-%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2">5. リストア</a></li>
<li><a href="#6-cron%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B">6. cronで管理</a></li>
<li><a href="#7-%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">7. おわりに</a></li>
<li><a href="#8-%E6%8A%80%E8%A1%93%E6%83%85%E5%A0%B1">8. 技術情報</a></li>
<li><a href="#9-%E5%8F%82%E8%80%83url">9. 参考URL</a></li>
</ul>

#<font color="DarkOrange">1. はじめに</font>
Ansible AWXはコンテナで動作しているため、初めはコンテナごとバックアップしようと考えていましたが、リストアの際にリスクが大きいと思い、他の手段を模索していたところtower-cliコマンドを発見しました。
簡易的ではありますが、バックアップのようなことが行えることがわかりましたので、使用方法をまとめます。

#<font color="DarkOrange">2. tower-cli インストール</font>
前提としてpipコマンドを使用できる環境でインストールしてください。
手順ではvirtualenv環境を使用し実行しています。

~~~
※仮想環境を作る場合は以下を行うこと
[root@localhost ~]# dnf install python3 -y
[root@localhost ~]# python3 -m venv venv
[root@localhost ~]# source venv/bin/activate
(venv) [root@localhost ~]#
~~~

tower-cliをインストールします。

~~~
(venv) [root@localhost ~]# pip install ansible-tower-cli
~~~

インストールを確認します。

~~~
(venv) [root@localhost ~]# pip freeze
ansible-tower-cli==3.3.9
~~~

#<font color="DarkOrange">3. tower-cli使用方法</font>
実際にコマンドを操作してみます。
まずconfigを確認します。

~~~
(venv) [root@localhost ~]# tower-cli config

# Defaults.
format: human
certificate:
username:
use_token: False
oauth_token:
verify_ssl: True
insecure: False
description_on: False
password:
verbose: False
host: 127.0.0.1
color: True
~~~

Ansible AWXの情報をconfigに設定します。
hostにはhttp(https)でAnsible AWXの宛先を設定します。

~~~
(venv) [root@localhost ~]# tower-cli config host http://"ansible awx IP"/
Configuration updated successfully.
~~~

usernameはAnsible AWXのログインユーザを設定します。

~~~
(venv) [root@localhost ~]# tower-cli config username admin
Configuration updated successfully.
~~~

passwordはログインパスワードを設定します。

~~~
(venv) [root@localhost ~]# tower-cli config password password
Configuration updated successfully.
~~~

ssl証明書の確認を無効にします。

~~~
(venv) [root@localhost ~]# tower-cli config verify_ssl false
Configuration updated succe
~~~

設定後に確認してみます。
以下のようになっていれば設定完了です。

~~~
(venv) [root@localhost ~]# tower-cli config

# User options (set with `tower-cli config`; stored in ~/.tower_cli.cfg).
host: http://"ansible awx IP"/
username: admin
password: password
verify_ssl: False

# Defaults.
description_on: False
format: human
use_token: False
color: True
insecure: False
verbose: False
certificate:
oauth_token:
~~~

#<font color="DarkOrange">4. オブジェクトのエクスポート</font>
Ansible AWXでオブジェクトはテンプレート、プロジェクト、インベントリ、などのことを示しています。
ファイル名は任意です。以下のようにコマンドを記載すれば実行日時で保存されます。

~~~
(venv) [root@localhost ~]# tower-cli receive --all > `date +%Y%m%d_%H-%M-%S`.jcon
~~~

ファイルを確認します。

~~~
(venv) [root@localhost ~]# ls
20200714_02-22-59.jcon
~~~

#<font color="DarkOrange">5. リストア</font>
エクスポートしたファイルを使用し実行します。

~~~
(venv) [root@localhost ~]# tower-cli send 20200714_02-22-59.jcon
~~~

以下例としてAWX インベントリにtest_inventoryが存在する場合(○)存在しない場合(×)の挙動になります。

| バックアップ時 |バックアップ後 | 設定値の変更 | リストア結果 |
| :-----------: | :----------: | :---------:  | :--------- |
| test_inventory　○ | test_inventory ○ | 有 | 設定値が上書きで復元される |
| test_inventory　× | test_inventory ○ | - | 復元なし。バックアップ後に存在するオブジェクトも削除されない |
| test_inventory　○ | test_inventory × | - | オブジェクトごと復元される |


実態はREST APIでPOSTしているようです。

#<font color="DarkOrange">6. cronで管理する</font>
項番5のエクスポートを定期的に行い、cronで世代管理を行います。
まずバックアップ用のディレクトリを作成しておきます。

~~~
(venv) [root@localhost ~]# mkdir awx_backup_dir
~~~

スクリプトは以下のような感じで作成し、cron.weeklyやmonthlyなどに格納すればその周期で実行され管理することができます。

~~~
(venv) [root@localhost ~]# vi ansible_awx_backup
#!/bin/bash

PATH=/user/local/sbin:/user/bin:/bin
backup_dir=/root/awx_backup_dir

# 仮想環境に切り替える
source /root/venv/bin/activate

# ディレクトリを移動する
cd ${backup_dir}

# オブジェクトをエクスポートする
tower-cli receive --all > `date +%Y%m%d_%H-%M-%S`.jcon

# 5世代分残し以降の世代を削除する
ls -t ${backup_dir} | tail -n +6 | xargs -r rm -rf
~~~

#<font color="DarkOrange">7. おわりに</font>
Ansible Towerでのバックアップはsetup.shファイルを使用すれば簡単に出来ますが、Ansible AWXではどのように行うのか気になったのでまとめてみました。
検証中に誤ってオブジェクトを削除してしまったりしてもバックアップを取っていれば安心ですね。

#<font color="DarkOrange">8. 技術情報</font>
[Ansibleの入門者向け学習ガイド(CentOS編)](http://c.itdo.jp/technical-information/ansible/ansible-tutorial/)や[Ansibleの入門者向け学習ガイド(Windows編)](http://c.itdo.jp/technical-information/ansible/ansible%e5%85%a5%e9%96%80%e8%80%85%e5%90%91%e3%81%91%e5%ad%a6%e7%bf%92%e3%82%ac%e3%82%a4%e3%83%89-windows%e7%b7%a8/)など入門者向けの記事を執筆しています。
また、[Ansible-Vaultを使用した暗号化の方法](http://c.itdo.jp/technical-information/ansible/ansible-vault/)も執筆していますので、ご参考にしていただければと思います。

#<font color="DarkOrange">9. 参考URL</font>
https://www.unixarena.com/2019/03/backup-restore-ansible-awx-tower-cli.html/
https://docs.ansible.com/ansible-tower/3.1.4/html_ja/towerapi/tower_cli.html