Memo/Ansible/Loops
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*Loops: ループ制御 [#fbeaa7b7]
-[[Loops — Ansible Documentation:https://docs.ansib...
----
** index: ループ時にインデックスを使う [#w10185ef]
- [[Extended loop variables:https://docs.ansible.com/ansi...
-- ansible 2.8以降
-- 以下を付けると使える
#geshi(yaml){{{
loop_control:
extended: yes
}}}
-- ansible_loop.index0: 0から始まる
-- ansible_loop.index: 1から始まる
----
** list型をloopする時の違い [#e88dbfc7]
Nested List変数をloopする時の挙動が違う
- 環境
-- ansible 2.9.2
- with_items
-- "{{ var | flatten(levels=1) }}" と同じ
- with_list, loop
-- flatten()されない。必要な場合は、明示的にflatten()を指...
例: 共通の値を、default.yml に定義して、他のyamlでマージ...
- default.yml
#geshi(yaml){{{
default_conf:
- name: var1
- name: var2
}}}
- overwrite.yml
#geshi(yaml){{{
example_conf:
- "{{ default_conf }}"
- name: var3
}}}
- playbook.yml
#geshi(yaml){{{
- hosts: localhost
connection: local
gather_facts: false
vars_files:
- default.yml
- overwrite.yml
tasks:
- debug:
var: example_conf
- name: with_items
debug:
var: item
with_items: "{{ example_conf }}"
- name: with_list
debug:
var: item
with_list: "{{ example_conf }}"
- name: loop
debug:
var: item
loop: "{{ example_conf }}"
- name: loop flatten(levels=1)
debug:
var: item
loop: "{{ example_conf | flatten(levels=1) }}"
}}}
- 実行結果
#geshi(bash){{
ansible-playbook playbook.yml
TASK [debug] ********************************************...
ok: [localhost] => {
"example_conf": [
[
{
"name": "var1"
},
{
"name": "var2"
}
],
{
"name": "var3"
}
]
}
TASK [with_items] ***************************************...
ok: [localhost] => (item={u'name': u'var1'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var1"
}
}
ok: [localhost] => (item={u'name': u'var2'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var2"
}
}
ok: [localhost] => (item={u'name': u'var3'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var3"
}
}
TASK [with_list] ****************************************...
ok: [localhost] => (item=[{u'name': u'var1'}, {u'name': u...
"ansible_loop_var": "item",
"item": [
{
"name": "var1"
},
{
"name": "var2"
}
]
}
ok: [localhost] => (item={u'name': u'var3'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var3"
}
}
TASK [loop] *********************************************...
ok: [localhost] => (item=[{u'name': u'var1'}, {u'name': u...
"ansible_loop_var": "item",
"item": [
{
"name": "var1"
},
{
"name": "var2"
}
]
}
ok: [localhost] => (item={u'name': u'var3'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var3"
}
}
TASK [loop flatten(levels=1)] ***************************...
ok: [localhost] => (item={u'name': u'var1'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var1"
}
}
ok: [localhost] => (item={u'name': u'var2'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var2"
}
}
ok: [localhost] => (item={u'name': u'var3'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var3"
}
}
}}
----
** Loop Control [#b200d528]
- [[Loop Control:https://docs.ansible.com/ansible/latest/...
-- loop_var
-- label
-- pause
-- index_var
----
*** label: ループ中の表示を抑制する [#md3aee93]
複雑な変数の場合、ループ中に非常に大きい出力になり見難い。~
「no_log: yes」では全部抑制されてしまい、不便。
- 以下のようにすると成功時は「item.name」だけ表示されるよ...
#geshi(yaml){{{
loop_control:
label: "{{ item.name }}"
}}}
----
*** pause: ループ毎に数秒待つ [#pe89863a]
- playbook.yml
#geshi(yaml){{{
- hosts: localhost
gather_facts: false
vars:
servers:
- server1
- server2
tasks:
- name: create servers, pause 3s before creating next
debug:
msg: "{{ item }}"
with_items: "{{ servers }}"
loop_control:
pause: 3
}}}
----
** with_subelements: サブ要素でループ [#xe1c7e87]
-[[Looping over Subelements:https://docs.ansible.com/ansi...
-- 3重以上のループは非対応
-記事
--[[サブ要素をループするAnsibleのwith_subelements | Deve...
- 以下のような多重ループで、「user03」に「groups:」が無い...
-- 「- skip_missing: True」を付けると要素が無い場合にスキ...
- ansible v2.7.1
- playbook.yml
#geshi(yaml){{{
- hosts: localhost
gather_facts: no
connection: local
vars:
- users:
- name: user01
groups:
- group01
- name: user02
groups:
- group01
- group02
- name: user03
tasks:
- debug:
msg: "name={{ item.0.name }}, group={{ item.1 }}"
with_subelements:
- "{{ users }}"
- groups
- skip_missing: True
}}}
- 実行結果
#geshi(bash){{{
ansible-playbook playbook.yml
...
TASK [debug] ********************************************...
ok: [127.0.0.1] => (item=[{u'name': u'user01'}, u'group01...
"msg": "name=user01, group=group01"
}
ok: [127.0.0.1] => (item=[{u'name': u'user02'}, u'group01...
"msg": "name=user02, group=group01"
}
ok: [127.0.0.1] => (item=[{u'name': u'user02'}, u'group02...
"msg": "name=user02, group=group02"
}
}}}
----
** with_fileglob: ファイル名にワイルドカードを指定してル...
localに置いた不特定のファイルをワイルドカード(*,?)を使っ...
remoteのファイルは非対応。
-[[Loops ― Ansible Documentation:http://docs.ansible.com/...
----
**with_nested: 複数階層ループ [#c1fe065f]
-[[Loops Ansible Documentation:http://docs.ansible.com/a...
- playbook
#geshi(yaml){{{
- name: give users access to multiple databases
debug: var="name={{ item[0] }} priv={{ item[1] }}"
with_nested:
- [ 'alice', 'bob' ]
- [ 'clientdb', 'employeedb' ]
}}}
- 実行結果
#geshi(bash){{{
TASK: [give users access to multiple databases] *********...
ok: [127.0.0.1] => (item=['alice', 'clientdb']) => {
"item": [
"alice",
"clientdb"
],
"var": {
"name=alice priv=clientdb": "name=alice priv=clie...
}
}
ok: [127.0.0.1] => (item=['alice', 'employeedb']) => {
"item": [
"alice",
"employeedb"
],
"var": {
"name=alice priv=employeedb": "name=alice priv=em...
}
}
ok: [127.0.0.1] => (item=['bob', 'clientdb']) => {
"item": [
"bob",
"clientdb"
],
"var": {
"name=bob priv=clientdb": "name=bob priv=clientdb"
}
}
ok: [127.0.0.1] => (item=['bob', 'employeedb']) => {
"item": [
"bob",
"employeedb"
],
"var": {
"name=bob priv=employeedb": "name=bob priv=employ...
}
}
}}}
終了行:
#contents
*Loops: ループ制御 [#fbeaa7b7]
-[[Loops — Ansible Documentation:https://docs.ansib...
----
** index: ループ時にインデックスを使う [#w10185ef]
- [[Extended loop variables:https://docs.ansible.com/ansi...
-- ansible 2.8以降
-- 以下を付けると使える
#geshi(yaml){{{
loop_control:
extended: yes
}}}
-- ansible_loop.index0: 0から始まる
-- ansible_loop.index: 1から始まる
----
** list型をloopする時の違い [#e88dbfc7]
Nested List変数をloopする時の挙動が違う
- 環境
-- ansible 2.9.2
- with_items
-- "{{ var | flatten(levels=1) }}" と同じ
- with_list, loop
-- flatten()されない。必要な場合は、明示的にflatten()を指...
例: 共通の値を、default.yml に定義して、他のyamlでマージ...
- default.yml
#geshi(yaml){{{
default_conf:
- name: var1
- name: var2
}}}
- overwrite.yml
#geshi(yaml){{{
example_conf:
- "{{ default_conf }}"
- name: var3
}}}
- playbook.yml
#geshi(yaml){{{
- hosts: localhost
connection: local
gather_facts: false
vars_files:
- default.yml
- overwrite.yml
tasks:
- debug:
var: example_conf
- name: with_items
debug:
var: item
with_items: "{{ example_conf }}"
- name: with_list
debug:
var: item
with_list: "{{ example_conf }}"
- name: loop
debug:
var: item
loop: "{{ example_conf }}"
- name: loop flatten(levels=1)
debug:
var: item
loop: "{{ example_conf | flatten(levels=1) }}"
}}}
- 実行結果
#geshi(bash){{
ansible-playbook playbook.yml
TASK [debug] ********************************************...
ok: [localhost] => {
"example_conf": [
[
{
"name": "var1"
},
{
"name": "var2"
}
],
{
"name": "var3"
}
]
}
TASK [with_items] ***************************************...
ok: [localhost] => (item={u'name': u'var1'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var1"
}
}
ok: [localhost] => (item={u'name': u'var2'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var2"
}
}
ok: [localhost] => (item={u'name': u'var3'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var3"
}
}
TASK [with_list] ****************************************...
ok: [localhost] => (item=[{u'name': u'var1'}, {u'name': u...
"ansible_loop_var": "item",
"item": [
{
"name": "var1"
},
{
"name": "var2"
}
]
}
ok: [localhost] => (item={u'name': u'var3'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var3"
}
}
TASK [loop] *********************************************...
ok: [localhost] => (item=[{u'name': u'var1'}, {u'name': u...
"ansible_loop_var": "item",
"item": [
{
"name": "var1"
},
{
"name": "var2"
}
]
}
ok: [localhost] => (item={u'name': u'var3'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var3"
}
}
TASK [loop flatten(levels=1)] ***************************...
ok: [localhost] => (item={u'name': u'var1'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var1"
}
}
ok: [localhost] => (item={u'name': u'var2'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var2"
}
}
ok: [localhost] => (item={u'name': u'var3'}) => {
"ansible_loop_var": "item",
"item": {
"name": "var3"
}
}
}}
----
** Loop Control [#b200d528]
- [[Loop Control:https://docs.ansible.com/ansible/latest/...
-- loop_var
-- label
-- pause
-- index_var
----
*** label: ループ中の表示を抑制する [#md3aee93]
複雑な変数の場合、ループ中に非常に大きい出力になり見難い。~
「no_log: yes」では全部抑制されてしまい、不便。
- 以下のようにすると成功時は「item.name」だけ表示されるよ...
#geshi(yaml){{{
loop_control:
label: "{{ item.name }}"
}}}
----
*** pause: ループ毎に数秒待つ [#pe89863a]
- playbook.yml
#geshi(yaml){{{
- hosts: localhost
gather_facts: false
vars:
servers:
- server1
- server2
tasks:
- name: create servers, pause 3s before creating next
debug:
msg: "{{ item }}"
with_items: "{{ servers }}"
loop_control:
pause: 3
}}}
----
** with_subelements: サブ要素でループ [#xe1c7e87]
-[[Looping over Subelements:https://docs.ansible.com/ansi...
-- 3重以上のループは非対応
-記事
--[[サブ要素をループするAnsibleのwith_subelements | Deve...
- 以下のような多重ループで、「user03」に「groups:」が無い...
-- 「- skip_missing: True」を付けると要素が無い場合にスキ...
- ansible v2.7.1
- playbook.yml
#geshi(yaml){{{
- hosts: localhost
gather_facts: no
connection: local
vars:
- users:
- name: user01
groups:
- group01
- name: user02
groups:
- group01
- group02
- name: user03
tasks:
- debug:
msg: "name={{ item.0.name }}, group={{ item.1 }}"
with_subelements:
- "{{ users }}"
- groups
- skip_missing: True
}}}
- 実行結果
#geshi(bash){{{
ansible-playbook playbook.yml
...
TASK [debug] ********************************************...
ok: [127.0.0.1] => (item=[{u'name': u'user01'}, u'group01...
"msg": "name=user01, group=group01"
}
ok: [127.0.0.1] => (item=[{u'name': u'user02'}, u'group01...
"msg": "name=user02, group=group01"
}
ok: [127.0.0.1] => (item=[{u'name': u'user02'}, u'group02...
"msg": "name=user02, group=group02"
}
}}}
----
** with_fileglob: ファイル名にワイルドカードを指定してル...
localに置いた不特定のファイルをワイルドカード(*,?)を使っ...
remoteのファイルは非対応。
-[[Loops ― Ansible Documentation:http://docs.ansible.com/...
----
**with_nested: 複数階層ループ [#c1fe065f]
-[[Loops Ansible Documentation:http://docs.ansible.com/a...
- playbook
#geshi(yaml){{{
- name: give users access to multiple databases
debug: var="name={{ item[0] }} priv={{ item[1] }}"
with_nested:
- [ 'alice', 'bob' ]
- [ 'clientdb', 'employeedb' ]
}}}
- 実行結果
#geshi(bash){{{
TASK: [give users access to multiple databases] *********...
ok: [127.0.0.1] => (item=['alice', 'clientdb']) => {
"item": [
"alice",
"clientdb"
],
"var": {
"name=alice priv=clientdb": "name=alice priv=clie...
}
}
ok: [127.0.0.1] => (item=['alice', 'employeedb']) => {
"item": [
"alice",
"employeedb"
],
"var": {
"name=alice priv=employeedb": "name=alice priv=em...
}
}
ok: [127.0.0.1] => (item=['bob', 'clientdb']) => {
"item": [
"bob",
"clientdb"
],
"var": {
"name=bob priv=clientdb": "name=bob priv=clientdb"
}
}
ok: [127.0.0.1] => (item=['bob', 'employeedb']) => {
"item": [
"bob",
"employeedb"
],
"var": {
"name=bob priv=employeedb": "name=bob priv=employ...
}
}
}}}
ページ名: