![](/img/trans.png)
[英]Ansible: iterate over output with loop and get values for each list
[英]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.