Ansible Tower(AWX) のワークフローテンプレート作成方法

スポンサーリンク

Ansible TowerまたはAWXでワークフローテンプレートを作成する方法を説明します。Ansible Towerには複数のジョブテンプレートを組み合わせるワークフロー機能が存在します。例えば、アプリケーション担当者のデプロイ作業、サーバ担当者のサーバ追加作業、ネットワーク担当者のロードバランサ設定変更などのジョブテンプレートを組み合わせる事によって、担当者間のコミュニケーションコストを削減する事ができます。

様々な運用形態に対応できるようGUI, CLI, APIの3通りの設定手順をまとめます。

GUIによるワークフローテンプレート作成

前提説明

ワークフローを体験するために「顧客増に伴うサーバ追加」のようなシナリオを想定します。予め、以下のジョブテンプレートが作成されている状態からの操作方法を説明します。

Ansible Tower 作成済のジョブテンプレート

ID ジョブ
20 サーバ追加 構築
21 サーバ追加 テスト
22 サーバ追加 解析ログ収集
23 ロードバランサ メンバー追加の操作
24 ロードバランサ メンバー追加後のテスト
25 ロードバランサ メンバー追加の戻し
26 ロードバランサ メンバー追加の解析ログ収集

ワークフロー作成

「テンプレート」の画面に遷移し、「+(追加)」ボタンを押下し「ワークフローテンプレート」を選びます。

Ansible Tower ワークフローテンプレートの追加01

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

Ansible Tower ワークフローテンプレートの追加02

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

Ansible Tower ワークフロービジュアライザーの有効化01

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

Ansible Tower ワークフロービジュアライザーの有効化02

ワークフロービジュアライザー

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

Ansible Tower ワークフロービジュアライザーの編集01

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

Ansible Tower ワークフロービジュアライザーの編集02

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

Ansible Tower ワークフロービジュアライザーの編集03

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

Ansible Tower ワークフロービジュアライザーの編集04

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

Ansible Tower ワークフローの完成

ワークフロー実行

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

Ansible Tower ワークフローテンプレートの実行

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

Ansible Tower ワークフローテンプレートの実行結果

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":"ロードバランサ メンバー追加の解析ログ収集"}

最終的に、以下スクリーンショットのようなワークフローを作成する事を目標とします。

Ansible Tower ワークフローの完成

ワークフロージョブテンプレートの作成

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",

Ansible Tower ワークフロージョブの途中経過確認

タイトルとURLをコピーしました