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


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

Ansible

ホーム > Ansible Tower・AWX リファレンス

Ansibleも他言語と同様にループ処理を実装することが可能です。ここでは、実例を交えながらループ処理の記述方法を解説したいと思います。

Ansibleでのループ処理は、他言語でよく見かける For~文ではなく、「with_~」ディレクティブを使用します。
この with_~ ですが、かなり種類が多いので、記事を分割して解説していきたいと思います。

この記事で解説するループ処理

with_list:リストを元にループ

with_list は、リストを元にループを行います。
Ansibleで最もシンプルなループ処理です。

書式

with_list の書式です。

with_list:
  - '要素1'
  - '要素2'
  - '要素3'

プレイブック

サンプルのプレイブックです。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: ループ処理【with_list】
    debug:
      msg: "{{ item }}"
    with_list:
      - one
      - two
      - three

このプレイブックでは、with_listのインプットになるリスト「one, two, three」という順番でループが行われます。

下記は実行結果の一部です。値がリストの順番で表示されていることが分かります。

TASK [ループ処理【with_list】] ********************************************************
ok: [192.168.56.105] => (item=one) => {
    "msg": "one"
}
ok: [192.168.56.105] => (item=two) => {
    "msg": "two"
}
ok: [192.168.56.105] => (item=three) => {
    "msg": "three"
}

実行結果

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

SSH password: 
BECOME password[defaults to SSH password]: 

PLAY [all] *********************************************************************

TASK [ループ処理【with_list】] ********************************************************
ok: [192.168.56.105] => (item=one) => {
    "msg": "one"
}
ok: [192.168.56.105] => (item=two) => {
    "msg": "two"
}
ok: [192.168.56.105] => (item=three) => {
    "msg": "three"
}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

with_items:配列を元にループ

Ansibleでは、配列を作成することが可能で、with_items は、その配列を元にループを行います。
Ansibleで最もポピュラーなループ処理です。

前述のwith_listとほぼ同じように使用することも可能ですが、べた書きのリストを元にする場合は、with_listを使用、配列を元にする場合はwith_itemsを使用するようです。

書式

with_items の書式です。

with_items: "{{ ループに使用する配列 }}"

プレイブック

サンプルのプレイブックです。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: 配列の作成
    set_fact:
      services:
        - "tomcat"
        - "apache"
        - "ansible"

  - name: ループ処理【with_items】
    debug:
      msg: "{{ item }}"
    with_items: "{{ services }}"

このプレイブックでは、まず下記のような配列を作成しています。

・配列名:services
・要素1:tomcat
・要素2:apache
・要素3:ansible

次に作成した配列を元にループしつつ、配列の値を表示しています。
プレイブックの「with_items: “{{ services }}”」という記述が、配列を元にループ処理を行うというものです。
また、配列から取り出した値は「item」という変数に格納されます
なので、プレイブックでは、「msg: “{{ item }}”」と記述してメッセージとして表示させています。

下記は実行結果の一部です。配列に格納した値が順番に表示されていることが分かります。

TASK [ループ処理【with_items】] *******************************************************
ok: [192.168.56.105] => (item=tomcat) => {
    "msg": "tomcat"
}
ok: [192.168.56.105] => (item=apache) => {
    "msg": "apache"
}
ok: [192.168.56.105] => (item=ansible) => {
    "msg": "ansible"
}

実行結果

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

SSH password: 
BECOME password[defaults to SSH password]: 

PLAY [all] *********************************************************************

TASK [配列の作成] *******************************************************************
ok: [192.168.56.105]

TASK [ループ処理【with_items】] *******************************************************
ok: [192.168.56.105] => (item=tomcat) => {
    "msg": "tomcat"
}
ok: [192.168.56.105] => (item=apache) => {
    "msg": "apache"
}
ok: [192.168.56.105] => (item=ansible) => {
    "msg": "ansible"
}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

with_indexed_items:配列を元にループしつつ連番を取得

前述のwith_itemsと同様に配列を元にしてループを行いますが、それに加え、with_indexed_itemsでは、0から始まるシーケンス(連番)も合わせて取得します。
巷では滅多に使用しないとか、使いどころが分からないといわれているらしいです。。

書式

with_indexed_items の書式です。

with_indexed_items: "{{ ループに使用する配列 }}"

プレイブック

サンプルのプレイブックです。
ここでは、JBOSSのデプロイ処理を例として説明します。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: 配列の作成
    set_fact:
      jboss_eap_process:
        - "stop"
        - "undeploy"
        - "deploy"
        - "start"

  - name: ループ処理【with_indexed_items】
    debug:
      msg: "{{ item.0 }}_jboss_eap_{{ item.1 }}.log"
    with_indexed_items: "{{ jboss_eap_process }}"

このプレイブックでは、まず下記のような配列を作成しています。

・配列名:jboss_eap_process
・要素1:stop
・要素2:undeploy
・要素3:deploy
・要素4:start

次に作成した配列を元にループしつつ、配列の値を表示しています。
プレイブックの「with_items: “{{ jboss_eap_process }}”」という記述が、配列を元にループ処理を行うというものです。

また、配列から取り出した値は「item」という変数に格納されます
しかし、with_indexed_itemsでは、配列の要素シーケンスの2つが取り出されます。
単純に「item」という変数を使用すると、下記のように配列の要素とシーケンスのセットで取り出されてしまいます

"msg": [
        0,
        "stop"
    ]

下記のように記述することで、配列の要素とシーケンスをそれぞれ取り出して使用することが可能です。

添え字取得する項目取得する値の例
item.0シーケンス(連番)0
item.1配列の要素stop

なので、プレイブックでは、item.0 と item.1 を組み合わせて「”{{ item.0 }}jboss_eap{{ item.1 }}.log”」と記述しています。

下記は実行結果の一部です。配列の要素とシーケンスが組み合わされて、ファイル名が作成されていることが分かります。

TASK [ループ処理【with_indexed_items】] ***********************************************
ok: [192.168.56.105] => (item=[0, 'stop']) => {
    "msg": "0_jboss_eap_stop.log"
}
ok: [192.168.56.105] => (item=[1, 'undeploy']) => {
    "msg": "1_jboss_eap_undeploy.log"
}
ok: [192.168.56.105] => (item=[2, 'deploy']) => {
    "msg": "2_jboss_eap_deploy.log"
}
ok: [192.168.56.105] => (item=[3, 'start']) => {
    "msg": "3_jboss_eap_start.log"
}

今回のサンプルでは、ログのファイル名を作成してみました。
シーケンス(連番)を付けずに、ログファイルを作成すると下記のようにアルファベット順となり、処理の順番からズレてしまいます。それを回避するような場合に使用しても良いかもしれません。

シーケンスが無いとファイルの並び順が処理順から外れる

jboss_eap_deploy.log
jboss_eap_start.log
jboss_eap_stop.log
jboss_eap_undeploy.log

シーケンスを付けてファイルの並び順を処理順に

0_jboss_eap_stop.log
1_jboss_eap_undeploy.log
2_jboss_eap_deploy.log
3_jboss_eap_start.log

シーケンスは0から開始ですが、下記のように記述することで開始番号を変えることも可能です。

“{{ item.0 + 1 }}jboss_eap{{ item.1 }}.log”

実行結果

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

SSH password: 
BECOME password[defaults to SSH password]: 

PLAY [all] *********************************************************************

TASK [配列の作成] *******************************************************************
ok: [192.168.56.105]

TASK [ループ処理【with_indexed_items】] ***********************************************
ok: [192.168.56.105] => (item=[0, 'stop']) => {
    "msg": "0_jboss_eap_stop.log"
}
ok: [192.168.56.105] => (item=[1, 'undeploy']) => {
    "msg": "1_jboss_eap_undeploy.log"
}
ok: [192.168.56.105] => (item=[2, 'deploy']) => {
    "msg": "2_jboss_eap_deploy.log"
}
ok: [192.168.56.105] => (item=[3, 'start']) => {
    "msg": "3_jboss_eap_start.log"
}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

with_flattened:ネスト(入れ子)された配列でも通常の配列のようにループ

Ansibleでは、配列をネスト(入れ子)することが可能です。
with_flattenedを使用することで、ネストされた配列を通常の配列として、ループを行います。

書式

with_flattened の書式です。

with_flattened: "{{ ループに使用するネスト(入れ子)された配列 }}"

プレイブック

サンプルのプレイブックです。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: ループ処理【with_flattened】
    debug:
      msg: "{{ item }}"
    with_flattened: ["one", ["two", [["three"]]]]

配列「[“one”, [“two”, [[“three”]]]]」がネスト(入れ子)されています。
こちらも他のループ処理と同様、「”{{ item }}”」変数に値が格納されます。

下記は実行結果の一部です。
ネストされていた配列が、通常の配列のようにループ処理されていることが分かります。

TASK [ループ処理【with_flattened】] ***************************************************
ok: [192.168.56.105] => (item=one) => {
    "msg": "one"
}
ok: [192.168.56.105] => (item=two) => {
    "msg": "two"
}
ok: [192.168.56.105] => (item=three) => {
    "msg": "three"
}

実行結果

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

SSH password: 
BECOME password[defaults to SSH password]: 

PLAY [all] *********************************************************************

TASK [ループ処理【with_flattened】] ***************************************************
ok: [192.168.56.105] => (item=one) => {
    "msg": "one"
}
ok: [192.168.56.105] => (item=two) => {
    "msg": "two"
}
ok: [192.168.56.105] => (item=three) => {
    "msg": "three"
}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

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

コメント

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