【Ansible Tower/AWX】ループ処理の記述方法②


この記事はプロモーションを含みます。

Ansible

ホーム > 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)

回目のループ

“{{ item.0 }}”:配列-要素
“{{ item.1 }}”:配列-要素
“{{ item.2 }}”:配列-要素

回目のループ

“{{ item.0 }}”:配列-要素
“{{ item.1 }}”:配列-要素
“{{ item.2 }}”:配列-要素

回目のループ

“{{ item.0 }}”:配列-要素
“{{ item.1 }}”:配列-要素
“{{ item.2 }}”:配列-要素

下記が実行結果の一部です。値がそれぞれの配列の要素順で表示されていることが分かります。

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】

下記のように存在しない配列(例では item.1)を指定するとエラーになります。

  - name: ループ処理【with_together】
    debug:
      msg: "【{{ item.0 }}】【{{ item.1 }}】"
    with_together:
      - ["配列1-要素1", "配列1-要素2", "配列1-要素3"]
エラーの内容

fatal: [192.168.56.105]: FAILED! => {“msg”: “The task includes an option with an undefined variable. The error was: list object has no element 1\n\nThe error appears to be in ‘/tmp/awx_583_k368_wha/project/directive_with.yml’: line 73, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n# ■with_together\n – name: ループ処理【with_together】\n ^ here\n”}

実行結果

サンプルのプレイブックを実行した結果になります。

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 に下記のような辞書を元にしてループを行うよう記述しています。

キー
key1val1
key2val2
key3val3

下記は実行結果の一部です。キーと値のセットごとにループが行われていることが分かります。

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

「ループ処理の記述方法②」は以上になります。
他のループ処理については、以下の記事をご覧ください。

コメント

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