Memo/Ansible/Loops

https://dexlab.net:443/pukiwiki/index.php?Memo/Ansible/Loops
 

Loops: ループ制御


list型をloopする時の違い

Nested List変数をloopする時の挙動が違う

  • 環境
    • ansible 2.9.2
  • with_items
    • "{{ var | flatten(levels=1) }}" と同じ
  • with_list, loop
    • flatten()されない。必要な場合は、明示的にflatten()を指定する。

例: 共通の値を、default.yml に定義して、他のyamlでマージして使いたい。example_confでは3回ループして欲しい。

  • default.yml
    default_conf:
      - name: var1
      - name: var2
  • overwrite.yml
    example_conf:
      - "{{ default_conf }}"
      - name: var3
  • playbook.yml
    - 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) }}"
  • 実行結果
    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」では全部抑制されてしまい、不便。

  • 以下のようにすると成功時は「item.name」だけ表示されるようになる。失敗時は失敗した要素だけフルで表示される。
      loop_control:
        label: "{{ item.name }}"

pause: ループ毎に数秒待つ

  • playbook.yml
    - 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: サブ要素でループ

  • 以下のような多重ループで、「user03」に「groups:」が無いため、通常エラーになる。
    • 「- skip_missing: True」を付けると要素が無い場合にスキップされる
  • ansible v2.7.1
  • playbook.yml
    - 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
  • 実行結果
    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: 複数階層ループ

  • playbook
        - name: give users access to multiple databases
          debug: var="name={{ item[0] }} priv={{ item[1] }}"
          with_nested:
            - [ 'alice', 'bob' ]
            - [ 'clientdb', 'employeedb' ]
  • 実行結果
    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"
        }
    }

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-02-14 (金) 17:53:36 (251d)