ホーム > Ansible Tower・AWX リファレンス
Ansibleも他言語と同様にループ処理を実装することが可能です。ここでは、実例を交えながらループ処理の記述方法を解説したいと思います。
Ansibleでのループ処理は、他言語でよく見かける For~文ではなく、「with_~」ディレクティブを使用します。
前回に引き続き、今回は以下のディレクティブを解説します。
with_together:複数の配列を結合してループ
with_together は、複数の配列を結合しつつ、ループを行います。
書式
with_together の書式です。
with_together: - 配列1 - 配列2 - 配列3
プレイブック
サンプルのプレイブックです。
---
- hosts: all
gather_facts: False
tasks:
- name: ループ処理【with_together】
debug:
msg: "【{{ item.0 }}】【{{ item.1 }}】【 {{ item.2 }}】"
with_together:
- ["配列1-要素1", "配列1-要素2", "配列1-要素3"]
- ["配列2-要素1", "配列2-要素2", "配列2-要素3"]
- ["配列3-要素1", "配列3-要素2", "配列3-要素3"]
このプレイブックでは、with_togetherのインプットとなる複数のリストにある「要素1」のセット、「要素2」のセット、「要素3」のセットごとにループが行われます。
ループ中の値は、「item.添え字」という変数に格納されます。
このプレイブックで取得される組み合わせは下記のようになります。
赤字のように要素ごとにループされる(ループ回数と同期する)
緑字のようにitemの添え字は配列と同期する(添え字は0からなので-1)
下記が実行結果の一部です。値がそれぞれの配列の要素順で表示されていることが分かります。
TASK [ループ処理【with_together】] **************************************************** ok: [192.168.56.105] => (item=['配列1-要素1', '配列2-要素1', '配列3-要素1']) => { "msg": "【配列1-要素1】【配列2-要素1】【 配列3-要素1】" } ok: [192.168.56.105] => (item=['配列1-要素2', '配列2-要素2', '配列3-要素2']) => { "msg": "【配列1-要素2】【配列2-要素2】【 配列3-要素2】" } ok: [192.168.56.105] => (item=['配列1-要素3', '配列2-要素3', '配列3-要素3']) => { "msg": "【配列1-要素3】【配列2-要素3】【 配列3-要素3】" }
実行結果を見やすく並べてみました。
ループ1:【配列1-要素1】【配列2-要素1】【 配列3-要素1】 ループ2:【配列1-要素2】【配列2-要素2】【 配列3-要素2】 ループ3:【配列1-要素3】【配列2-要素3】【 配列3-要素3】
実行結果
サンプルのプレイブックを実行した結果になります。
SSH password:
BECOME password[defaults to SSH password]:
PLAY [all] *********************************************************************
TASK [ループ処理【with_together】] ****************************************************
ok: [192.168.56.105] => (item=['配列1-要素1', '配列2-要素1', '配列3-要素1']) => {
"msg": "【配列1-要素1】【配列2-要素1】【 配列3-要素1】"
}
ok: [192.168.56.105] => (item=['配列1-要素2', '配列2-要素2', '配列3-要素2']) => {
"msg": "【配列1-要素2】【配列2-要素2】【 配列3-要素2】"
}
ok: [192.168.56.105] => (item=['配列1-要素3', '配列2-要素3', '配列3-要素3']) => {
"msg": "【配列1-要素3】【配列2-要素3】【 配列3-要素3】"
}
PLAY RECAP *********************************************************************
192.168.56.105 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0
with_dict:辞書(dictionary)を元にループ
Ansibleでは、辞書(dictionary[ディクショナリ])を作成することが可能です。
with_dict を使用することで、辞書を元にループを行うことが出来ます。
書式
with_dict の書式です。
with_dict: "{{ ループに使用する辞書(ディクショナリ) }}"
プレイブック
サンプルのプレイブックです。
---
- hosts: all
gather_facts: False
tasks:
- name: ループ処理【with_dict】
debug:
msg: "【{{ item.key }}】【{{ item.value }}】"
with_dict:
- { key1: "val1", key2: "val2", key3: "val3" }
このプレイブックでは、with_dict に下記のような辞書を元にしてループを行うよう記述しています。
キー | 値 |
---|---|
key1 | val1 |
key2 | val2 |
key3 | val3 |
下記は実行結果の一部です。キーと値のセットごとにループが行われていることが分かります。
TASK [ループ処理【with_dict】] **************************************************** ok: [192.168.56.105] => (item={'key': 'key1', 'value': 'val1'}) => { "msg": "【key1】【val1】" } ok: [192.168.56.105] => (item={'key': 'key2', 'value': 'val2'}) => { "msg": "【key2】【val2】" } ok: [192.168.56.105] => (item={'key': 'key3', 'value': 'val3'}) => { "msg": "【key3】【val3】" }
ちなみに「item」と指定することで、キー・値の両方を取得することが可能です。
- name: ループ処理【with_dict】
debug:
msg: "【{{ item }}】"
with_dict:
- { key1: "val1", key2: "val2", key3: "val3" }
TASK [ループ処理【with_dict】] **************************************************** ok: [192.168.56.105] => (item={'key': 'key1', 'value': 'val1'}) => { "msg": "【{'key': 'key1', 'value': 'val1'}】" } ok: [192.168.56.105] => (item={'key': 'key2', 'value': 'val2'}) => { "msg": "【{'key': 'key2', 'value': 'val2'}】" } ok: [192.168.56.105] => (item={'key': 'key3', 'value': 'val3'}) => { "msg": "【{'key': 'key3', 'value': 'val3'}】" }
以下のような辞書を元にループすることも可能です。
こちらの記法の方が良く見かけるような気もします。
- name: 辞書の作成
set_fact:
dict:
key1: val1
key2: val2
key3: val3
- name: ループ処理【with_dict】
debug:
msg: "【{{ item.key }}】【{{ item.value }}】"
with_dict: "{{ dict }}"
TASK [ループ処理【with_dict】] ******************************************************** ok: [192.168.56.105] => (item={'key': 'key1', 'value': 'val1'}) => { "msg": "【key1】【val1】" } ok: [192.168.56.105] => (item={'key': 'key2', 'value': 'val2'}) => { "msg": "【key2】【val2】" } ok: [192.168.56.105] => (item={'key': 'key3', 'value': 'val3'}) => { "msg": "【key3】【val3】" }
実行結果
サンプルのプレイブックを実行した結果になります。
SSH password:
BECOME password[defaults to SSH password]:
PLAY [all] *********************************************************************
TASK [ループ処理【with_dict】] ****************************************************
ok: [192.168.56.105] => (item={'key': 'key1', 'value': 'val1'}) => {
"msg": "【key1】【val1】"
}
ok: [192.168.56.105] => (item={'key': 'key2', 'value': 'val2'}) => {
"msg": "【key2】【val2】"
}
ok: [192.168.56.105] => (item={'key': 'key3', 'value': 'val3'}) => {
"msg": "【key3】【val3】"
}
PLAY RECAP *********************************************************************
192.168.56.105 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
with_sequence:指定条件(開始、終了、増加値)でループ
with_sequence は指定した条件(開始、終了、インクリメント数)でループを行います。
javaやExcelVBAなどの For文に近いイメージです。
書式
with_sequence の書式です。
with_sequence: start=開始値 end=終了値 stride=インクリメント値 format=表示形式
各オプションの説明です。
オプション | 説明 | 省略 | 例 |
---|---|---|---|
start | ループを開始する値を指定 | 不可 | 2 |
end | ループを終了する値を指定 | 不可 | 10 |
stride | インクリメントする値を指定 省略時の既定値は「1」 | 可能 | 2 |
format | 表示する形式を指定 省略時の既定値は「%d」 | 可能 | %02d |
プレイブック
サンプルのプレイブックです。
---
- hosts: all
gather_facts: False
tasks:
- name: ループ処理【with_sequence】
debug:
msg: "{{ item }}"
with_sequence: start=2 end=20 stride=3 format=%02d
このプレイブックでは、ループする条件として以下を設定しています。
・開始値:2 ・終了値:20 ・インクリメント:3 ・フォーマット:%02d(1桁の場合は、2桁にゼロパディングする)
下記は実行結果の一部で、2から開始し、3ずつ増加しつつ、20までループを行っています。
今回はフォーマット(表示形式)を指定しているため、1桁の場合は2桁になるようゼロパディングされています。
TASK [ループ処理【with_sequence】] **************************************************** ok: [192.168.56.105] => (item=02) => { "msg": "02" } ok: [192.168.56.105] => (item=05) => { "msg": "05" } ok: [192.168.56.105] => (item=08) => { "msg": "08" } ok: [192.168.56.105] => (item=11) => { "msg": "11" } ok: [192.168.56.105] => (item=14) => { "msg": "14" } ok: [192.168.56.105] => (item=17) => { "msg": "17" } ok: [192.168.56.105] => (item=20) => { "msg": "20" }
実行結果
サンプルのプレイブックを実行した結果になります。
SSH password:
BECOME password[defaults to SSH password]:
PLAY [all] *********************************************************************
TASK [ループ処理【with_sequence】] ****************************************************
ok: [192.168.56.105] => (item=02) => {
"msg": "02"
}
ok: [192.168.56.105] => (item=05) => {
"msg": "05"
}
ok: [192.168.56.105] => (item=08) => {
"msg": "08"
}
ok: [192.168.56.105] => (item=11) => {
"msg": "11"
}
ok: [192.168.56.105] => (item=14) => {
"msg": "14"
}
ok: [192.168.56.105] => (item=17) => {
"msg": "17"
}
ok: [192.168.56.105] => (item=20) => {
"msg": "20"
}
PLAY RECAP *********************************************************************
192.168.56.105 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
「ループ処理の記述方法②」は以上になります。
他のループ処理については、以下の記事をご覧ください。
コメント