概要
こんにちは。サイオステクノロジー 吉田です。
今回はAnsible Towerの機能の一つであるREST APIを使用し、外部からワークフローテンプレートを実行する方法になります。変数を渡して実行する方法も併せてご紹介します。この機能を利用して外部からリクエストを送信し環境作成用のテンプレートを作成するなど、他システムとの連携に使用できそうです。
REST APIからワークフローテンプレートの実行
前準備
REST APIで実行するワークフローテンプレートを作成しておきます。
今回使用するワークフローテンプレートのIDは16になります。

REST API実行
curlコマンドを使用してPOSTリクエストを送信します。
ヘッダにContent-Typeでjsonを指定し、実行ユーザのIDとPASSを指定します。
リクエストURLに実行するワークフローテンプレートのIDを入れ、workflow_job_templatesを指定します。
コマンド
curl -s -f -k -H 'Content-Type: application/json' -XPOST \
--user admin:redhat \
https://192.168.138.139/api/v2/workflow_job_templates/16/launch/
実行結果
{
"workflow_job": 229,
"ignored_fields": {},
"id": 229,
"type": "workflow_job",
"url": "/api/v2/workflow_jobs/229/",
"related": {
"created_by": "/api/v2/users/1/",
"modified_by": "/api/v2/users/1/",
"unified_job_template": "/api/v2/workflow_job_templates/16/",
"workflow_job_template": "/api/v2/workflow_job_templates/16/",
"notifications": "/api/v2/workflow_jobs/229/notifications/",
"workflow_nodes": "/api/v2/workflow_jobs/229/workflow_nodes/",
"labels": "/api/v2/workflow_jobs/229/labels/",
"activity_stream": "/api/v2/workflow_jobs/229/activity_stream/",
"relaunch": "/api/v2/workflow_jobs/229/relaunch/",
"cancel": "/api/v2/workflow_jobs/229/cancel/"
},
"summary_fields": {
"inventory": {
"id": 1,
"name": "Demo Inventory",
"description": "",
"has_active_failures": false,
"total_hosts": 1,
"hosts_with_active_failures": 0,
"total_groups": 0,
"groups_with_active_failures": 0,
"has_inventory_sources": false,
"total_inventory_sources": 0,
"inventory_sources_with_failures": 0,
"organization_id": 1,
"kind": ""
},
"workflow_job_template": {
"id": 16,
"name": "a-0_workflow-test",
"description": ""
},
"unified_job_template": {
"id": 16,
"name": "a-0_workflow-test",
"description": "",
"unified_job_type": "workflow_job"
},
"created_by": {
"id": 1,
"username": "admin",
"first_name": "",
"last_name": ""
},
"modified_by": {
"id": 1,
"username": "admin",
"first_name": "",
"last_name": ""
},
"user_capabilities": {
"start": true,
"delete": true
},
"labels": {
"count": 0,
"results": []
}
},
"created": "2019-05-31T02:37:20.739421Z",
"modified": "2019-05-31T02:37:20.819886Z",
"name": "a-0_workflow-test",
"description": "",
"unified_job_template": 16,
"launch_type": "manual",
"status": "pending",
"failed": false,
"started": null,
"finished": null,
"elapsed": 0,
"job_args": "",
"job_cwd": "",
"job_env": {},
"job_explanation": "",
"result_traceback": "",
"workflow_job_template": 16,
"extra_vars": "{}",
"allow_simultaneous": false,
"job_template": null,
"is_sliced_job": false,
"inventory": 1
}
ジョブが実行されたようです。
状態を確認するAPIを叩いてみましょう。
curl -f -k -XGET --user admin:redhat \
https://192.168.138.139/api/v2/workflow_jobs/229/
実行結果
{
"id": 229,
"type": "workflow_job",
"url": "/api/v2/workflow_jobs/229/",
"related": {
"created_by": "/api/v2/users/1/",
"modified_by": "/api/v2/users/1/",
"unified_job_template": "/api/v2/workflow_job_templates/16/",
"workflow_job_template": "/api/v2/workflow_job_templates/16/",
"notifications": "/api/v2/workflow_jobs/229/notifications/",
"workflow_nodes": "/api/v2/workflow_jobs/229/workflow_nodes/",
"labels": "/api/v2/workflow_jobs/229/labels/",
"activity_stream": "/api/v2/workflow_jobs/229/activity_stream/",
"relaunch": "/api/v2/workflow_jobs/229/relaunch/",
"cancel": "/api/v2/workflow_jobs/229/cancel/"
},
"summary_fields": {
"inventory": {
"id": 1,
"name": "Demo Inventory",
"description": "",
"has_active_failures": false,
"total_hosts": 1,
"hosts_with_active_failures": 0,
"total_groups": 0,
"groups_with_active_failures": 0,
"has_inventory_sources": false,
"total_inventory_sources": 0,
"inventory_sources_with_failures": 0,
"organization_id": 1,
"kind": ""
},
"workflow_job_template": {
"id": 16,
"name": "a-0_workflow-test",
"description": ""
},
"unified_job_template": {
"id": 16,
"name": "a-0_workflow-test",
"description": "",
"unified_job_type": "workflow_job"
},
"created_by": {
"id": 1,
"username": "admin",
"first_name": "",
"last_name": ""
},
"modified_by": {
"id": 1,
"username": "admin",
"first_name": "",
"last_name": ""
},
"user_capabilities": {
"start": true,
"delete": true
},
"labels": {
"count": 0,
"results": []
}
},
"created": "2019-05-31T02:37:20.739421Z",
"modified": "2019-05-31T02:37:43.183905Z",
"name": "a-0_workflow-test",
"description": "",
"unified_job_template": 16,
"launch_type": "manual",
"status": "successful",
"failed": false,
"started": "2019-05-31T02:37:21.922370Z",
"finished": "2019-05-31T02:37:43.164390Z",
"elapsed": 21.242,
"job_args": "",
"job_cwd": "",
"job_env": {},
"job_explanation": "",
"result_traceback": "",
"workflow_job_template": 16,
"extra_vars": "{}",
"allow_simultaneous": false,
"job_template": null,
"is_sliced_job": false,
"inventory": 1
}
status successful で処理か終了しています。
ジョブの実行結果はAnsibleTowerの画面からも確認できます。
REST APIからワークフローテンプレートの実行(引数あり)
もう一つ使い方として、引数を渡してワークフローテンプレートを実行したいというのがあると思います。
こちらの方法について見ていきましょう。
前準備
前準備としてワークフローテンプレートに”SURVEYの追加”から、変数の名前と型(テキスト、パスワード、整数、etc)を設定しておきます。こちらが設定されていないとリクエストを受け入れてくれません。
基本はテンプレート実行時のリクエストと同じです。渡す変数をjson形式でbodyとして渡します。
今回は以下の変数を渡す方法で試してみます。
{
"extra_vars":
"{
"wordpress_url": "https://ja.wordpress.org/wordpress-4.4.2-ja.tar.gz"
}"
}
REST API実行
コマンド実行
curl -s -f -k -H 'Content-Type: application/json' -XPOST \
-d '{"extra_vars": "{\"wordpress_url\": \"https://ja.wordpress.org/wordpress-4.4.2-ja.tar.gz\"}"}' \
--user admin:redhat https://192.168.138.139/api/v2/workflow_job_templates/9/launch/
実行結果
{
"workflow_job": 232,
"ignored_fields": {},
"id": 232,
"type": "workflow_job",
"url": "/api/v2/workflow_jobs/232/",
"related": {
"created_by": "/api/v2/users/1/",
"modified_by": "/api/v2/users/1/",
"unified_job_template": "/api/v2/workflow_job_templates/9/",
"workflow_job_template": "/api/v2/workflow_job_templates/9/",
"notifications": "/api/v2/workflow_jobs/232/notifications/",
"workflow_nodes": "/api/v2/workflow_jobs/232/workflow_nodes/",
"labels": "/api/v2/workflow_jobs/232/labels/",
"activity_stream": "/api/v2/workflow_jobs/232/activity_stream/",
"relaunch": "/api/v2/workflow_jobs/232/relaunch/",
"cancel": "/api/v2/workflow_jobs/232/cancel/"
},
"summary_fields": {
"workflow_job_template": {
"id": 9,
"name": "make-wordpress",
"description": ""
},
"unified_job_template": {
"id": 9,
"name": "make-wordpress",
"description": "",
"unified_job_type": "workflow_job"
},
"created_by": {
"id": 1,
"username": "admin",
"first_name": "",
"last_name": ""
},
"modified_by": {
"id": 1,
"username": "admin",
"first_name": "",
"last_name": ""
},
"user_capabilities": {
"start": true,
"delete": true
},
"labels": {
"count": 0,
"results": []
}
},
"created": "2019-05-31T02:56:00.977114Z",
"modified": "2019-05-31T02:56:01.087561Z",
"name": "make-wordpress",
"description": "",
"unified_job_template": 9,
"launch_type": "manual",
"status": "pending",
"failed": false,
"started": null,
"finished": null,
"elapsed": 0,
"job_args": "",
"job_cwd": "",
"job_env": {},
"job_explanation": "",
"result_traceback": "",
"workflow_job_template": 9,
"extra_vars": "{\"wordpress_url\": \"https://ja.wordpress.org/wordpress-4.4.2-ja.tar.gz\"}",
"allow_simultaneous": false,
"job_template": null,
"is_sliced_job": false,
"inventory": null
}
実行結果のextra_varsに引数が渡されていることが確認できます。
AnsibleTowerの画面からジョブを表示すると追加変数のエリアにあることが確認できます。

状態確認のAPIでも確認してみましょう。
コマンド実行
curl -f -k -XGET --user admin:redhat \
https://192.168.138.139/api/v2/workflow_jobs/232/
実行結果
{
"id": 232,
"type": "workflow_job",
"url": "/api/v2/workflow_jobs/232/",
"related": {
"created_by": "/api/v2/users/1/",
"modified_by": "/api/v2/users/1/",
"unified_job_template": "/api/v2/workflow_job_templates/9/",
"workflow_job_template": "/api/v2/workflow_job_templates/9/",
"notifications": "/api/v2/workflow_jobs/232/notifications/",
"workflow_nodes": "/api/v2/workflow_jobs/232/workflow_nodes/",
"labels": "/api/v2/workflow_jobs/232/labels/",
"activity_stream": "/api/v2/workflow_jobs/232/activity_stream/",
"relaunch": "/api/v2/workflow_jobs/232/relaunch/",
"cancel": "/api/v2/workflow_jobs/232/cancel/"
},
"summary_fields": {
"workflow_job_template": {
"id": 9,
"name": "make-wordpress",
"description": ""
},
"unified_job_template": {
"id": 9,
"name": "make-wordpress",
"description": "",
"unified_job_type": "workflow_job"
},
"created_by": {
"id": 1,
"username": "admin",
"first_name": "",
"last_name": ""
},
"modified_by": {
"id": 1,
"username": "admin",
"first_name": "",
"last_name": ""
},
"user_capabilities": {
"start": true,
"delete": true
},
"labels": {
"count": 0,
"results": []
}
},
"created": "2019-05-31T02:56:00.977114Z",
"modified": "2019-05-31T03:01:33.517826Z",
"name": "make-wordpress",
"description": "",
"unified_job_template": 9,
"launch_type": "manual",
"status": "successful",
"failed": false,
"started": "2019-05-31T02:56:02.143070Z",
"finished": "2019-05-31T03:01:33.508121Z",
"elapsed": 331.365,
"job_args": "",
"job_cwd": "",
"job_env": {},
"job_explanation": "",
"result_traceback": "",
"workflow_job_template": 9,
"extra_vars": "{\"wordpress_url\": \"https://ja.wordpress.org/wordpress-4.4.2-ja.tar.gz\"}",
"allow_simultaneous": false,
"job_template": null,
"is_sliced_job": false,
"inventory": null
}
リクエストで渡した引数が追加変数として設定されているのが確認できます。
このようにplaybook内で変数化しているものを起動時に指定して実行する事も可能です。
まとめ
REST API経由でワークフローテンプレートを実行する事ができました。
これを活用することでGUIを操作せずテンプレートを実行することができます。
外部から変数を指定することで柔軟に再利用可能なテンプレートを作成できそうです。
他のシステムからリクエストを送信してテンプレートを実行する。なんて利用方法もできそうです。

