簡體   English   中英

迭代dict Ansible,每個key多個值

[英]Iterate dict Ansible, each key multiple values

我有一個這樣的字典:

  distr:
    Alice:
    - Avocado
    - Cherries
    Bob:
    - Apple
    David:
    - Pineapple
    - Watermelon
    John:
    - Banana
    - Mango
    Shara:
    - Orange
    - Peach

現在我想用每個組合執行一個任務。

像這樣:

Alice eats Avocado
Alice eats Cherries
Bob eats Apple
David eats Pineapple
David eats Watermelon
...

我的 ansible 是這樣的:

- name: Debug
  debug:
    msg: {{ item.key }} eats {{ item }}
  with_items: "{{ lookup('dict', distr) }}"

結果:

TASK [Debug] *******************************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'Alice ', 'value': ['Avocado', 'Cherries']}) => {
    "msg": "Alice eats ['Avocado', 'Cherries']"
}
ok: [localhost] => (item={'key': 'Bob ', 'value': ['Apple']}) => {
    "msg": "Bob eats ['Apple']"
}
ok: [localhost] => (item={'key': 'David ', 'value': ['Pineapple', 'Watermelon']}) => {
    "msg": "David eats ['Pineapple', 'Watermelon']"
}

我嘗試了子元素和其他類型的循環,但沒有運氣。 我認為這真的很簡單。

我們需要處理您的數據以將其轉化為更有用的結構。 我們想要一個由(person, food)元組組成的平面列表,我們可以使用product過濾器到達那里,它返回兩個列表的叉積。 例如,表達式["Alice"]|product(["Avocado", "Cherries"])計算為[["Alice", "Avocado"], ["Alice", "Cherries"]]

我們可以使用循環的set_fact任務來創建我們的列表:

- set_fact:
    cross: "{{ cross + [item[0]]|product(item[1])|list }}"
  loop: "{{ distr.items()|list }}"
  vars:
    cross: []

上述任務遍歷字典的每個(key, values)元組,並將鍵和值的叉積附加到新列表cross中。 結果如下所示:

"cross": [
    [
        "Alice",
        "Avocado"
    ],
    [
        "Alice",
        "Cherries"
    ],
    [
        "Bob",
        "Apple"
    ],
    [
        "David",
        "Pineapple"
    ],
    [
        "David",
        "Watermelon"
    ],
    [
        "John",
        "Banana"
    ],
    [
        "John",
        "Mango"
    ],
    [
        "Shara",
        "Orange"
    ],
    [
        "Shara",
        "Peach"
    ]
]

綜上所述,我們得到:

- hosts: localhost
  gather_facts: false
  vars:
    distr:
      Alice:
        - Avocado
        - Cherries
      Bob:
        - Apple
      David:
        - Pineapple
        - Watermelon
      John:
        - Banana
        - Mango
      Shara:
        - Orange
        - Peach

  tasks:
    - set_fact:
        cross: "{{ cross + [item[0]]|product(item[1])|list }}"
      loop: "{{ distr.items()|list }}"
      vars:
        cross: []

    - debug:
        msg: "{{ item[0] }} eats {{ item[1] }}"
      loop: "{{ cross }}"

而運行上述playbook的output是:

PLAY [localhost] *****************************************************************************************************************************************************************************

TASK [set_fact] ******************************************************************************************************************************************************************************
ok: [localhost] => (item=['Alice', ['Avocado', 'Cherries']])
ok: [localhost] => (item=['Bob', ['Apple']])
ok: [localhost] => (item=['David', ['Pineapple', 'Watermelon']])
ok: [localhost] => (item=['John', ['Banana', 'Mango']])
ok: [localhost] => (item=['Shara', ['Orange', 'Peach']])

TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => (item=['Alice', 'Avocado']) => {
    "msg": "Alice eats Avocado"
}
ok: [localhost] => (item=['Alice', 'Cherries']) => {
    "msg": "Alice eats Cherries"
}
ok: [localhost] => (item=['Bob', 'Apple']) => {
    "msg": "Bob eats Apple"
}
ok: [localhost] => (item=['David', 'Pineapple']) => {
    "msg": "David eats Pineapple"
}
ok: [localhost] => (item=['David', 'Watermelon']) => {
    "msg": "David eats Watermelon"
}
ok: [localhost] => (item=['John', 'Banana']) => {
    "msg": "John eats Banana"
}
ok: [localhost] => (item=['John', 'Mango']) => {
    "msg": "John eats Mango"
}
ok: [localhost] => (item=['Shara', 'Orange']) => {
    "msg": "Shara eats Orange"
}
ok: [localhost] => (item=['Shara', 'Peach']) => {
    "msg": "Shara eats Peach"
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM