Ansible TowerまたはAWXでダイナミックインベントリを使用する方法を説明します。Ansbile TowerはGUIやAPIで操作対象のホストを定義する事もできますが、Ansible Tower外部のシステムと連携して動的にインベントリを変化させる事もできます。
Git管理のインベントリファイル、vCenter、AWSなどを連携させる事もできます。このページではGit管理のインベントリファイルと連携させる方法をまとめます。
様々な運用形態に対応できるようGUI, CLI, APIの3通りの設定手順をまとめます。
事前準備 – インベントリファイルの作成
事前準備としてGitリポジトリ内に以下のようなインベントリファイルを作成します。このGitリポジトリは、Ansible Tower(AWX)のプロジェクトとして登録されている前提で操作方法を説明します。
[ios:vars]
ansible_connection = network_cli
ansible_network_os = 'ios'
ansible_user = 'cisco'
ansible_password = 'cisco'
[eos:vars]
ansible_connection = network_cli
ansible_network_os = 'eos'
ansible_user = 'admin'
ansible_password = 'admin'
[ios]
ios171 ansible_host=192.168.1.171
ios172 ansible_host=192.168.1.172
[eos]
eos173 ansible_host=192.168.1.173
eos174 ansible_host=192.168.1.174
ダイナミックインベントリの設定
インベントリソースの定義
インベントリの「ソース」の設定画面に遷移し、「+(追加)」ボタンを押下します。
必要な情報を入力し「保存」を押下します。Gitリポジトリ内のインベントリファイルを使用する場合は、「ソース」は「ソース:プロジェクト」を選びます。
CLIまたはAPIで操作する場合は以下の通りです。inventory_id, project_idは環境に応じて適宜変更ください。
CLI操作
awx inventory_sources create \
--name "Network Devices Inventory" \
--description "" \
--source "scm" \
--source_path "inventory.ini" \
--inventory "逸般の誤家庭" \
--source_project "スターダストクルセイダース"
API操作
INVENTORY_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventories/ | \
jq '.results[] | select(.name == "逸般の誤家庭")' | jq ".id")
PROJECT_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/projects/ | \
jq '.results[] | select(.name == "スターダストクルセイダース")' | jq ".id")
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/inventory_sources/ << EOF
{
"name":"Network Devices Inventory",
"description":"",
"source":"scm",
"source_path":"inventory.ini",
"inventory":"${INVENTORY_ID}",
"source_project":"${PROJECT_ID}"
}
EOF
インベントの同期
インベントリファイルの設定が終わったら、インベントリの「ソース」の設定画面に戻ります。設定直後に自動的に同期されるわけではありませんので、「同期」ボタンを押下しインベントリ情報を同期させます。
同期に成功した場合は、「雲(クラウド)」のアイコンが緑に変わります。
CLIで操作する場合は以下の通りです。inventory_source_idは環境に応じて適宜変更ください。また、–monitorオプションを付与すると同期の様子をリアルタイムで観察する事もできます。
CLI操作
awx inventory_sources update "Network Devices Inventory" --monitor
APIで操作する場合は以下の通りです。inventory_source_idは環境に応じて適宜変更ください。同期の前後でstatusが”never updated”から”successful”に変わった事を確認できます。
API操作
INVENTORY_SOURCE_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventory_sources/ | \
jq '.results[] | select(.name == "Network Devices Inventory")' | jq ".id")
# statusが"never updated"である事の確認
curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventory_sources/${INVENTORY_SOURCE_ID}/ | jq "."
<omitted>
"last_job_run": null,
"last_job_failed": false,
"next_job_run": null,
"status": "never updated",
<omitted>
# インベントリを同期します
curl -XPOST -u admin:P@ssw0rd \
http://localhost/api/v2/inventory_sources/${INVENTORY_SOURCE_ID}/update/
# statusが"successful"である事の確認
curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventory_sources/${INVENTORY_SOURCE_ID}/update/
<omitted>
"last_job_run": "2020-08-21T10:04:27.055053Z",
"last_job_failed": false,
"next_job_run": null,
"status": "successful",
<omitted>
ホストの確認
インベントリのグループまたはホストの設定画面に、Gitリポジトリから読み込んだ設定が存在する事を確認します。グループやホストの設定画面を確認します。
変数もインベントリファイルからインポートされている事も確認します。
CLIまたはAPIで、インポートされたグループやホストを確認する操作は以下の通りです。
CLI操作
# INVENTORY_SOURCE_ID=<inventory_source_id>
# awx hosts list -f jq --filter '.results[] | {id,name,variables}'
{"id": 20, "name": "eos173", "variables": "{\"ansible_host\": \"192.168.1.173\"}"}
{"id": 21, "name": "eos174", "variables": "{\"ansible_host\": \"192.168.1.174\"}"}
{"id": 22, "name": "ios171", "variables": "{\"ansible_host\": \"192.168.1.171\"}"}
{"id": 23, "name": "ios172", "variables": "{\"ansible_host\": \"192.168.1.172\"}"}
{"id": 1, "name": "localhost", "variables": "ansible_connection: local\nansible_python_interpreter: '{{ ansible_playbook_python }}'"}
# awx groups list -f jq --filter '.results[] | {id,name,variables}'
{"id": 12, "name": "eos", "variables": "{\"ansible_connection\": \"network_cli\", \"ansible_network_os\": \"eos\", \"ansible_password\": \"admin\", \"ansible_user\": \"admin\"}"}
{"id": 13, "name": "ios", "variables": "{\"ansible_connection\": \"network_cli\", \"ansible_network_os\": \"ios\", \"ansible_password\": \"cisco\", \"ansible_user\": \"cisco\"}"}
CLI操作
# INVENTORY_SOURCE_ID=<inventory_source_id>
# curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventory_sources/${INVENTORY_SOURCE_ID}/hosts/ | \
jq -c '.results[] | {id,name,variables}'
{"id":20,"name":"eos173","variables":"{\"ansible_host\": \"192.168.1.173\"}"}
{"id":21,"name":"eos174","variables":"{\"ansible_host\": \"192.168.1.174\"}"}
{"id":22,"name":"ios171","variables":"{\"ansible_host\": \"192.168.1.171\"}"}
{"id":23,"name":"ios172","variables":"{\"ansible_host\": \"192.168.1.172\"}"}
# curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventory_sources/${INVENTORY_SOURCE_ID}/groups/ | \
jq -c '.results[] | {id,name,variables}'
{"id":12,"name":"eos","variables":"{\"ansible_connection\": \"network_cli\", \"ansible_network_os\": \"eos\", \"ansible_password\": \"admin\", \"ansible_user\": \"admin\"}"}
{"id":13,"name":"ios","variables":"{\"ansible_connection\": \"network_cli\", \"ansible_network_os\": \"ios\", \"ansible_password\": \"cisco\", \"ansible_user\": \"cisco\"}"}