Warm tip: This article is reproduced from serverfault.com, please click

python-字典中有清单的Ansible循环

(python - Ansible loop with a list in a dict)

发布于 2020-12-02 19:29:51

我正在寻找一个循环到字典的列表,但是在不修改我的栏的情况下,无法使用loop/with_*方法

如果有人给我小费,我会很高兴!

这是我的酒吧:

apps:
 - app1
 - app2
 - app3

我的设置:

settings:
  app1:
    url: myself
    arg1: value1
    arg2: value2
  app2:
    arg8: value32
    arg38: value00
  app3:
    arg42: /bin/false

而且我想为每个参数为每个应用程序执行命令。

所以我的解决方案是将列表和字典转换为:

settings:
 - name: app1
   arg: url
   value: myself
 - name: app1
   arg: arg1
   value: value1
 - name: app1
   arg: arg2
   value: value2
 - name: app2
   arg: ...

然后with_items在此列表上执行a并以名称arg和value执行我的命令。
这是唯一的解决方案吗?

Questioner
totor42
Viewed
0
β.εηοιτ.βε 2020-12-03 05:45:32

可以通过在之间插入set_fact,列出应用程序的所有参数,然后使用subelementAnsible提供Jinja过滤器根据创建的事实创建命令来实现。

鉴于剧本:

- hosts: all
  gather_facts: no
  vars:
    settings:
      app1:
        url: myself
        arg1: value1
        arg2: value2
      app2:
        arg8: value32
        arg38: value00
      app3:
        arg42: /bin/false
      
  tasks:
    ## 
    # This `set_fact` build this list [
    #  {"name": "app1", "args": ["url", "arg1", "arg2"]},
    #  {"name": "app2", "args": ["arg8", "arg38"]},
    #  {"name": "app2", "args": ["arg42"]}
    # ]
    ##
    - set_fact: 
        app_args: |-
          {{ 
            app_args | default([]) + 
            [ {'name': item, 'args': settings[item].keys() | list} ] 
          }}
      loop: "{{ settings.keys() }}"

    - debug:
        msg: >- 
          some_command {{ item.0.name }} 
          --{{ item.1 }}={{ settings[item.0.name][item.1] }}
      loop: "{{ app_args | subelements('args') }}"

这将产生回顾:

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

TASK [set_fact] **************************************************************************************************
ok: [localhost] => (item=app1)
ok: [localhost] => (item=app2)
ok: [localhost] => (item=app3)

TASK [debug] *****************************************************************************************************
ok: [localhost] => (item=[{'name': 'app1', 'args': ['url', 'arg1', 'arg2']}, 'url']) => {
    "msg": "some_command app1 --url=myself"
}
ok: [localhost] => (item=[{'name': 'app1', 'args': ['url', 'arg1', 'arg2']}, 'arg1']) => {
    "msg": "some_command app1 --arg1=value1"
}
ok: [localhost] => (item=[{'name': 'app1', 'args': ['url', 'arg1', 'arg2']}, 'arg2']) => {
    "msg": "some_command app1 --arg2=value2"
}
ok: [localhost] => (item=[{'name': 'app2', 'args': ['arg8', 'arg38']}, 'arg8']) => {
    "msg": "some_command app2 --arg8=value32"
}
ok: [localhost] => (item=[{'name': 'app2', 'args': ['arg8', 'arg38']}, 'arg38']) => {
    "msg": "some_command app2 --arg38=value00"
}
ok: [localhost] => (item=[{'name': 'app3', 'args': ['arg42']}, 'arg42']) => {
    "msg": "some_command app3 --arg42=/bin/false"
}

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