Ansible TowerまたはAWXで対話形式で変数を入力する方法を説明します。Ansibleは予め定義した変数ファイルを読み込む事ができるのでプレイブック実行前に変数ファイルを編集する運用も考えられますが、Ansible Tower(AWX)いわゆるレベル1エンジニア向けに対話形式で変数入力する機能も備えています。
対話形式の入力方法は「起動プロンプト」「SURVEY」の2パターンがあります。
事前準備
Ansible Towerを構築用途ではなく日々の運用用途で使用する事を考えると、直前で変数を入力しなければならないシナリオは容易に想像できます。例えば、ハードウェア不良が疑われる機器があるならば、対象の機器を変数として指定し、詳細情報を取得するようなプレイブックが考えられます。あるサービスを計画停止させたいならば、そのサービス名を変数として指定し、ロードバランサーから切り離すようなプレイブックが考えられます。
実践ではこのようなシナリオが考えられますが、ここでは話を単純化するために簡単な変数入力が必要なプレイブックを用意します。「右から殴るか、左から殴るか」を質問するプレイブックを例に挙げます。
cat << EOF > derby.yaml
---
- hosts: localhost
gather_facts: no
tasks:
- name : "ひ、ひと思いに・・・右でやってくれ"
debug:
msg : "{{flg_right}}!{{flg_right}}!{{flg_right}}!"
- name : "ひ・・・左?"
debug:
msg : "{{flg_left}}!{{flg_left}}!{{flg_left}}!"
- name : "もしかしてオラオラですかーッ!?"
debug:
msg : "{{flg_both}}!{{flg_both}}!{{flg_both}}! OH MY GOD"
EOF
起動プロンプト
ジョブテンプレートの作成
「テンプレート」の設定画面に遷移し、「+(追加)」「ジョブテンプレート」ボタンを押下します。
対話形式で変数入力を受け付けたい場合は、「起動プロンプト」にチェックを入れます。
CLIまたはAPIで操作する場合は以下の通りです。ask_variables_on_launchをtrueにする事で起動プロンプトが現れます。
CLI操作
awx job_templates create \
--name "質問だ…右の拳で殴るか?左の拳で殴るか?当ててみな" \
--description "" \
--organization "スピードワゴン財団" \
--inventory "逸般の誤家庭" \
--project "ストーンオーシャン" \
--playbook "derby.yaml" \
--extra_vars '---
flg_right : "No"
flg_left : "No"
flg_both : "Yes"' \
--ask_variables_on_launch true
API操作
ORGANIZATION_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/organizations/ | \
jq '.results[] | select(.name == "スピードワゴン財団")' | jq ".id")
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/job_templates/ << EOF
{
"name": "質問だ…右の拳で殴るか?左の拳で殴るか?当ててみな",
"description": "",
"organization": ${ORGANIZATION_ID},
"inventory": ${INVENTORY_ID},
"project": ${PROJECT_ID},
"playbook": "derby.yaml",
"ask_variables_on_launch": true,
"extra_vars": "{
\"flg_right\" : \"No\",
\"flg_left\" : \"No\",
\"flg_both\" : \"Yes\"
}"
}
EOF
ジョブテンプレートの実行
テンプレートの画面で「実行(ロケット)」ボタンを押下します。
ジョブの実行前に変数の編集画面が現れます。変数の編集後に、ジョブを実行します。
ジョブが実行された事を確認します。
CLIまたはAPIで実行する場合は以下の通りです。CLIまたはAPIの場合はジョブ実行前にフールプルーフのような特段の確認作業が入るわけではなく変数編集を省略しても実行できますし、変数を上書きする事もできます。引数extra_varsには上書きしたい変数のみを記載すれば十分です。
CLI操作
awx job_templates launch "質問だ…右の拳で殴るか?左の拳で殴るか?当ててみな" \
--extra_vars '---
flg_right : "いいえ"
flg_left : "いいえ"' \
--monitor
API操作
JOB_TEMPLATE_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/job_templates/ | \
jq '.results[] | select(.name == "質問だ…右の拳で殴るか?左の拳で殴るか?当ててみな")' | jq ".id")
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/job_templates/${JOB_TEMPLATE_ID}/launch/ << EOF | jq
{
"extra_vars": {
"flg_right": "いいえ",
"flg_left": "いいえ"
}
}
EOF
SURVEY
SURVEYの定義
前述の起動プロンプトでは、どの変数が何を意味するかが分かりづらい側面があります。これに対して、分かりやすい対話機能を補完するのがSURVEY機能です。
SURVEYを定義するには、ジョブテンプレートの「SURVEY」ボタンを押下します。
「変数に対する質問」「質問の回答を格納する変数名」「変数のデフォルト値」などを入力し、「ADD」を押下します。
同様の操作を繰り返すと以下のような画面になります。SURVEYの一通りの編集が終わりましたら、「保存」を押下します。
これをAPIで操作する場合は以下の通りです。変数name, descriptionはGUI上では表示されない設定値です。
API操作
JOB_TEMPLATE_ID=$(curl -u admin:P@ssw0rd \
http://localhost/api/v2/job_templates/ | \
jq '.results[] | select(.name == "質問だ…右の拳で殴るか?左の拳で殴るか?当ててみな")' | jq ".id")
curl -XPOST -u admin:P@ssw0rd \
--header "Content-Type: application/json" \
-d @- http://localhost/api/v2/job_templates/15/survey_spec/ << EOF | jq
{
"name": "",
"description": "",
"spec": [
{
"question_name": "ひ、ひと思いに・・・右でやってくれ",
"question_description": "",
"required": true,
"type": "text",
"variable": "flg_right",
"default": "No"
},
{
"question_name": "ひ・・・左?",
"question_description": "",
"required": true,
"type": "text",
"variable": "flg_left",
"default": "No"
},
{
"question_name": "もしかしてオラオラですかーッ!?",
"question_description": "",
"required": true,
"type": "text",
"variable": "flg_both",
"default": "Yes!Yes!Yes! OH MY GOD!"
}
]
}
EOF
ジョブテンプレートの実行
テンプレートの画面で「実行(ロケット)」ボタンを押下します。
SURVEYの入力を求められます。
ジョブが実行された事を確認します。