2017-02-10 3 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

はありがとうございことができます!これは私がChef over Anecessが好きな場所です。ここでRubyを書いてデータ構造を反復することができます。本質的には、これはPythonでここで行ったことですが、その構文はちょっと醜いです。 –

+1

@ChrisF私は、pythonではなくjinja2を書いています。 –

+0

はい、私はあなたに同意します。 PuppetとChefはこれのために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' } 
関連する問題