2017-02-10 8 views
5

说我有这个词典如何循环Ansible中的这本字典?

war_files: 
    server1: 
    - file1.war 
    - file2.war 
    server2: 
    - file1.war 
    - file2.war 
    - file3.war 

和现在我只想遍历每个项目(键),然后在上的键(值),每个项目。我做到了这一点

- name: Loop over the dictionary 
    debug: msg="Key={{ item.key }} value={{ item.value }}" 
    with_dict: "{{ war_files }}" 

我明白了。这当然是正确的,但不是我想要的。

ok: [localhost] => (item={'value': [u'file1.war', u'file2.war'], 'key': u'server1'}) => { 
    "item": { 
     "key": "server1", 
     "value": [ 
      "file1.war", 
      "file2.war" 
     ] 
    }, 
    "msg": "Server=server1, WAR=[u'file1.war', u'file2.war']" 
} 
ok: [localhost] => (item={'value': [u'file1.war', u'file2.war', u'file3.war'], 'key': u'server2'}) => { 
    "item": { 
     "key": "server2", 
     "value": [ 
      "file1.war", 
      "file2.war", 
      "file3.war" 
     ] 
    }, 
    "msg": "Server=server2, WAR=[u'file1.war', u'file2.war', u'file3.war']" 
} 

我想要得到的输出,说

"msg": "Server=server1, WAR=file1.war" 
"msg": "Server=server1, WAR=file2.war" 
"msg": "Server=server2, WAR=file1.war" 
"msg": "Server=server2, WAR=file2.war" 
"msg": "Server=server2, WAR=file3.war" 

IOW,我怎么能写在字典迭代任务如此这般通过每个键,然后在项目的每个关键之内?实质上,我有一个嵌套数组,并想迭代它呢?

回答

4

嗯,我无法找到一个非常简单的方法来做到这一点,但是,与Jinja2的一点点,就可以实现这种东西:

/tmp ❯❯❯ cat example.yml 
--- 
- hosts: 127.0.0.1 
    vars: 
    war_files: 
     server1: 
     - file1.war 
     - file2.war 
     server2: 
     - file1.war 
     - file2.war 
     - file3.war 
    tasks: 
    - set_fact: 
     war_files_list_of_dicts: | 
      {% set res = [] -%} 
      {% for key in war_files.keys() -%} 
      {% for value in war_files[key] -%} 
       {% set ignored = res.extend([{'Server': key, 'WAR':value}]) -%} 
      {%- endfor %} 
      {%- endfor %} 
      {{ res }} 

    - name: let's debug the crap out of this 
    debug: var=war_files_list_of_dicts 

    - name: Servers and their WARs!!! 
    debug: 
     msg: "Server={{ item.Server }}, WAR={{ item.WAR }}" 
    with_items: "{{ war_files_list_of_dicts }}" 

而且,在运行时,剧本:

/tmp ❯❯❯ ansible-playbook example.yml 
[WARNING]: provided hosts list is empty, only localhost is available 


PLAY [127.0.0.1] *************************************************************** 

TASK [setup] ******************************************************************* 
ok: [127.0.0.1] 

TASK [set_fact] **************************************************************** 
ok: [127.0.0.1] 

TASK [let's debug the crap out of this] **************************************** 
ok: [127.0.0.1] => { 
    "war_files_list_of_dicts": [ 
     { 
      "Server": "server1", 
      "WAR": "file1.war" 
     }, 
     { 
      "Server": "server1", 
      "WAR": "file2.war" 
     }, 
     { 
      "Server": "server2", 
      "WAR": "file1.war" 
     }, 
     { 
      "Server": "server2", 
      "WAR": "file2.war" 
     }, 
     { 
      "Server": "server2", 
      "WAR": "file3.war" 
     } 
    ] 
} 

TASK [Servers and their WARs!!!] *********************************************** 
ok: [127.0.0.1] => (item={'WAR': u'file1.war', 'Server': u'server1'}) => { 
    "item": { 
     "Server": "server1", 
     "WAR": "file1.war" 
    }, 
    "msg": "Server=server1, WAR=file1.war" 
} 
ok: [127.0.0.1] => (item={'WAR': u'file2.war', 'Server': u'server1'}) => { 
    "item": { 
     "Server": "server1", 
     "WAR": "file2.war" 
    }, 
    "msg": "Server=server1, WAR=file2.war" 
} 
ok: [127.0.0.1] => (item={'WAR': u'file1.war', 'Server': u'server2'}) => { 
    "item": { 
     "Server": "server2", 
     "WAR": "file1.war" 
    }, 
    "msg": "Server=server2, WAR=file1.war" 
} 
ok: [127.0.0.1] => (item={'WAR': u'file2.war', 'Server': u'server2'}) => { 
    "item": { 
     "Server": "server2", 
     "WAR": "file2.war" 
    }, 
    "msg": "Server=server2, WAR=file2.war" 
} 
ok: [127.0.0.1] => (item={'WAR': u'file3.war', 'Server': u'server2'}) => { 
    "item": { 
     "Server": "server2", 
     "WAR": "file3.war" 
    }, 
    "msg": "Server=server2, WAR=file3.war" 
} 

PLAY RECAP ********************************************************************* 
127.0.0.1     : ok=4 changed=0 unreachable=0 failed=0 
+0

谢谢!这是我喜欢Ansible上的厨师的地方,我可以在这里写Ruby来迭代数据结构。实质上,这就是你在Python中所做的,但是这种语法只是丑陋的。 –

+1

@ChrisF我写了jinja2,不是python。 –

+0

但是,我同意你的看法。由于这个原因,木偶和厨师比Ansible有优势。 –

0

现在Ansible允许这种

- name: add several users 
    user: 
    name: "{{ item.name }}" 
    state: present 
    groups: "{{ item.groups }}" 
    with_items: 
    - { name: 'testuser1', groups: 'wheel' } 
    - { name: 'testuser2', groups: 'root' }