ホーム > 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" }
今回のサンプルでは、ログのファイル名を作成してみました。
シーケンス(連番)を付けずに、ログファイルを作成すると下記のようにアルファベット順となり、処理の順番からズレてしまいます。それを回避するような場合に使用しても良いかもしれません。
シーケンスは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
「ループ処理の記述方法①」は以上になります。
他のループ処理については、以下の記事をご覧ください。
コメント