Ansible TowerまたはAWXでワークフローテンプレートを作成する方法を説明します。Ansible Towerには複数のジョブテンプレートを組み合わせるワークフロー機能が存在します。例えば、アプリケーション担当者のデプロイ作業、サーバ担当者のサーバ追加作業、ネットワーク担当者のロードバランサ設定変更などのジョブテンプレートを組み合わせる事によって、担当者間のコミュニケーションコストを削減する事ができます。
様々な運用形態に対応できるようGUI, CLI, APIの3通りの設定手順をまとめます。
GUIによるワークフローテンプレート作成
前提説明
ワークフローを体験するために「顧客増に伴うサーバ追加」のようなシナリオを想定します。予め、以下のジョブテンプレートが作成されている状態からの操作方法を説明します。

ID |
ジョブ |
20 |
サーバ追加 構築 |
21 |
サーバ追加 テスト |
22 |
サーバ追加 解析ログ収集 |
23 |
ロードバランサ メンバー追加の操作 |
24 |
ロードバランサ メンバー追加後のテスト |
25 |
ロードバランサ メンバー追加の戻し |
26 |
ロードバランサ メンバー追加の解析ログ収集 |
ワークフロー作成
「テンプレート」の画面に遷移し、「+(追加)」ボタンを押下し「ワークフローテンプレート」を選びます。

必要な情報を入力し「保存」を押下します。

保存後、今までグレーアウトされていた「SURVEYの追加」と「ワークフロービジュアライザー」のメニューが選べるようになります。

しばらくして「ワークフロービジュアライザー」の画面に自動的に遷移します。

ワークフロービジュアライザー
「開始」ボタンを押下すると、開始直後に実行するジョブテンプレートを選択する事ができます。実行したいジョブテンプレートをラジオボタンの中から選び、「選択」を押下します。

ジョブテンプレートの「+」ボタンを押下すると、ジョブ完了後に実行するジョブテンプレートを選択する事ができます。実行したいジョブテンプレートをラジオボタンの中から選び、「選択」を押下します。

ジョブテンプレート間の緑の線をクリックします。

ジョブの「成功時」に実行するか、「失敗時」に実行するか、「常」に実行するかを選ぶ事ができます。

最終的に作成されたワークフローは以下の通りです。

ワークフロー実行
ワークフローを実行するには、「テンプレート」の一覧画面でロケットのようなアイコンをクリックします。

ワークフローの実行中は以下の画面のように、どこの処理を実行しているかをグラフィカルに表示されます。

CLIまたはGUIによるワークフローテンプレート作成
前提説明
ワークフローを体験するために「顧客増に伴うサーバ追加」のようなシナリオを想定します。予め、以下のジョブテンプレートが作成されている状態からの操作方法を説明します。
# curl -u admin:P@ssw0rd \
http://localhost/api/v2/job_templates/ | \
jq -c '.results[] | {id,name}' | sort
{"id":20,"name":"サーバ追加 構築"}
{"id":21,"name":"サーバ追加 テスト"}
{"id":22,"name":"サーバ追加 解析ログ収集"}
{"id":23,"name":"ロードバランサ メンバー追加の操作"}
{"id":24,"name":"ロードバランサ メンバー追加後のテスト"}
{"id":25,"name":"ロードバランサ メンバー追加の戻し"}
{"id":26,"name":"ロードバランサ メンバー追加の解析ログ収集"}
最終的に、以下スクリーンショットのようなワークフローを作成する事を目標とします。

ワークフロージョブテンプレートの作成
CLIまたはAPIでワークフロージョブテンプレートを作成します。「組織」と「インベントリ」は名前ではなくidで指定します。
CLI操作
awx workflow_job_templates create \
--name "ワークフロー サーバ追加" \
--description "" \
--organization 5 \
--inventory 4
API操作
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_templates/ << EOF
{
"name": "ワークフロー サーバ追加",
"description": "",
"organization": 5,
"inventory": 4
}
EOF
組織とインベントリのIDを調べるには以下のような操作をします。
CLI操作
# awx organizations list -f human
# awx inventories list -f human
API操作
curl -u admin:P@ssw0rd \
http://localhost/api/v2/organizations/ | \
jq -c '.results[] | {id,name}'
curl -u admin:P@ssw0rd \
http://localhost/api/v2/inventories/ | \
jq -c '.results[] | {id,name}'
ワークフロージョブテンプレートノードの作成
CLIやAPIの操作では、ワークフローを構成する1つ1つのジョブは「ワークフロージョブテンプレートノード」という用語で呼ばれています。まずは「ワークフロージョブテンプレートノード」を作成します。
作成するときは「ワークフロージョブテンプレート」「ジョブテンプレート」のidを引数として与えます。まずはこれらのidを調べましょう。
CLI操作
# awx workflow_job_templates list -f human
id name
== =============
28 ワークフロー サーバ追加
# awx job_templates list -f human
id name
== =====================
21 サーバ追加 テスト
24 ロードバランサ メンバー追加後のテスト
25 ロードバランサ メンバー追加の戻し
23 ロードバランサ メンバー追加の操作
20 サーバ追加 構築
26 ロードバランサ メンバー追加の解析ログ収集
22 サーバ追加 解析ログ収集
API操作
# curl -u admin:P@ssw0rd \
http://localhost/api/v2/workflow_job_templates/ | \
jq -c '.results[] | {id,name}' | sort
{"id":28,"name":"ワークフロー サーバ追加"}
# curl -u admin:P@ssw0rd \
http://localhost/api/v2/job_templates/ | \
jq -c '.results[] | {id,name}' | sort
{"id":20,"name":"サーバ追加 構築"}
{"id":21,"name":"サーバ追加 テスト"}
{"id":22,"name":"サーバ追加 解析ログ収集"}
{"id":23,"name":"ロードバランサ メンバー追加の操作"}
{"id":24,"name":"ロードバランサ メンバー追加後のテスト"}
{"id":25,"name":"ロードバランサ メンバー追加の戻し"}
{"id":26,"name":"ロードバランサ メンバー追加の解析ログ収集"}
「ワークフロージョブテンプレートノード」を作成するには、workflow_job_templateに「ワークフロージョブテンプレート」のidを指定し、unified_job_templateに「ジョブテンプレート」のidを指定します。
CLI操作
for job_id in {20..26}
do
awx workflow_job_template_nodes create \
--workflow_job_template 28 \
--unified_job_template ${job_id}
done
API操作
for job_id in {20..26}
do
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_template_nodes/ << EOF
{
"workflow_job_template": 28,
"unified_job_template": ${job_id}
}
EOF
done
ワークフロージョブテンプレートノードの前後関係の定義
ワークフロージョブテンプレートノードについて、ジョブを実行する前後関係を定義します。まずは、作成されたワークフロージョブテンプレートノードのidを確認します。
CLI操作
# awx workflow_job_template_nodes list \
-f human --filter id,unified_job_template
id unified_job_template
== ====================
25 20
26 21
27 22
28 23
29 24
30 25
31 26
API操作
# curl -u admin:P@ssw0rd \
http://localhost/api/v2/workflow_job_templates/28/workflow_nodes/ | \
jq -c '.results[] | {id,unified_job_template}'
{"id":25,"unified_job_template":20}
{"id":26,"unified_job_template":21}
{"id":27,"unified_job_template":22}
{"id":28,"unified_job_template":23}
{"id":29,"unified_job_template":24}
{"id":30,"unified_job_template":25}
{"id":31,"unified_job_template":26}
以上の情報を整理すると以下のようになります。
workflow_job_template_nodes id |
job templates id |
job templates name |
25 |
20 |
サーバ追加 構築 |
26 |
21 |
サーバ追加 テスト |
27 |
22 |
サーバ追加 解析ログ収集 |
28 |
23 |
ロードバランサ メンバー追加の操作 |
29 |
24 |
ロードバランサ メンバー追加後のテスト |
30 |
25 |
ロードバランサ メンバー追加の戻し |
31 |
26 |
ロードバランサ メンバー追加の解析ログ収集 |
id 25の「サーバ追加 構築」の後、成功時のみid 26の「サーバ追加 テスト」を実行するには、以下のようなCLIまたはAPIを実行します。
awxkit 14.0.0 時点でCLI操作でジョブの前後関係を定義する方法を見つける事ができませんでした。製作者の見落としでしたら申し訳ございません。
API操作
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_template_nodes/25/success_nodes/ << EOF
{
"id": 26
}
EOF
id 26の「サーバ追加 テスト」の後、エラー時のみid 27の「サーバ追加 解析ログ収集」を実行するには、以下のようなCLIまたはAPIを実行します。
API操作
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_template_nodes/26/failure_nodes/ << EOF
{
"id": 27
}
EOF
以下同様に、ジョブの前後関係を定義すると以下のような操作になります。
API操作
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_template_nodes/26/success_nodes/ << EOF
{
"id": 28
}
EOF
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_template_nodes/28/always_nodes/ << EOF
{
"id": 29
}
EOF
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_template_nodes/29/failure_nodes/ << EOF
{
"id": 30
}
EOF
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_template_nodes/30/always_nodes/ << EOF
{
"id": 31
}
EOF
もし操作を誤り前後関係を削除したい場合は、以下のようにdisassociateを指定します。
API操作
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/workflow_job_template_nodes/30/always_nodes/ << EOF
{
"id": 31,
"disassociate": 31
}
EOF
ワークフロージョブテンプレートの実行
CLIまたはAPIで、ワークフローテンプレートを実行するには以下のような操作を実施します。
実行結果を参照するにはworkflow_job idを指定する必要がありますので、この時に出力されるworkflow_job idはメモに控えるようにしましょう。
CLI操作
# awx workflow_job_templates launch 28
{
"workflow_job": 42,
"ignored_fields": {},
"id": 42,
"type": "workflow_job",
"url": "/api/v2/workflow_jobs/42/",
<omitted>
API操作
# curl -XPOST -u admin:P@ssw0rd http://localhost/api/v2/workflow_job_templates/28/launch/ | jq "."
{
"workflow_job": 52,
"ignored_fields": {},
"id": 52,
"type": "workflow_job",
"url": "/api/v2/workflow_jobs/52/",
<omitted>
CLIまたはAPIで、実行結果を参照するには以下のような操作を実施します。CLIならばリアルタイムでジョブがどこまで進行しているかを見る「awx workflow_jobs monitor」コマンドもあります。
CLI操作
# awx workflow_jobs get 42
<omitted>
"description": "",
"unified_job_template": 28,
"launch_type": "manual",
"status": "running",
"failed": false,
"started": "2020-08-19T07:55:23.675848Z",
<omitted>
# awx workflow_jobs monitor 42
------Starting Standard Out Stream------
Launching ワークフロー サーバ追加...
? 43 - サーバ追加 構築 successful
? 44 - サーバ追加 テスト successful
? 45 - ロードバランサ メンバー追加の操作 running
API操作
# curl -u admin:P@ssw0rd http://localhost/api/v2/workflow_jobs/52/ | jq "."
<omitted>
"created": "2020-08-19T08:19:54.814218Z",
"modified": "2020-08-19T08:19:56.215682Z",
"name": "ワークフロー サーバ追加",
"description": "",
"unified_job_template": 28,
"launch_type": "manual",
"status": "running",
"failed": false,
"started": "2020-08-19T08:19:56.197368Z",
