Loops: ループ制御 †
list型をloopする時の違い †
Nested List変数をloopする時の挙動が違う
- with_items
- "{{ var | flatten(levels=1) }}" と同じ
- with_list, loop
- flatten()されない。必要な場合は、明示的にflatten()を指定する。
例: 共通の値を、default.yml に定義して、他のyamlでマージして使いたい。example_confでは3回ループして欲しい。
- 実行結果
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'var2'}]) => {
"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'var2'}]) => {
"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 †
label: ループ中の表示を抑制する †
複雑な変数の場合、ループ中に非常に大きい出力になり見難い。
「no_log: yes」では全部抑制されてしまい、不便。
pause: ループ毎に数秒待つ †
with_subelements: サブ要素でループ †
- 以下のような多重ループで、「user03」に「groups:」が無いため、通常エラーになる。
- 「- skip_missing: True」を付けると要素が無い場合にスキップされる
- 実行結果
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のファイルは非対応。
with_nested: 複数階層ループ †
- 実行結果
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=clientdb"
}
}
ok: [127.0.0.1] => (item=['alice', 'employeedb']) => {
"item": [
"alice",
"employeedb"
],
"var": {
"name=alice priv=employeedb": "name=alice priv=employeedb"
}
}
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=employeedb"
}
}
|
|