Ansible Tower(AWX) のダイナミックインベントリ – Git連携させる場合

スポンサーリンク

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

ダイナミックインベントリの設定

インベントリソースの定義

インベントリの「ソース」の設定画面に遷移し、「+(追加)」ボタンを押下します。

Ansible Tower AWX ダイナミックインベントリのインベントリソースの設定01

必要な情報を入力し「保存」を押下します。Gitリポジトリ内のインベントリファイルを使用する場合は、「ソース」は「ソース:プロジェクト」を選びます。

Ansible Tower AWX ダイナミックインベントリのインベントリソースの設定02

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

インベントの同期

インベントリファイルの設定が終わったら、インベントリの「ソース」の設定画面に戻ります。設定直後に自動的に同期されるわけではありませんので、「同期」ボタンを押下しインベントリ情報を同期させます。

Ansible Tower AWX ダイナミックインベントリのインベント同期01

同期に成功した場合は、「雲(クラウド)」のアイコンが緑に変わります。

Ansible Tower AWX ダイナミックインベントリのインベント同期02

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リポジトリから読み込んだ設定が存在する事を確認します。グループやホストの設定画面を確認します。

Ansible Tower AWX ダイナミックインベントリの同期された設定の確認01

変数もインベントリファイルからインポートされている事も確認します。

Ansible Tower AWX ダイナミックインベントリの同期された設定の確認02

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\"}"}
タイトルとURLをコピーしました