我总是在Ansible中为迭代而苦恼,这次也没有什么不同。
无论如何,我有一个自定义事实作为字典my_list
的列表返回,我需要迭代以构建一个以key = 'name'
命名的新变量
[localhost] => {
"ansible_facts": {
"my_list": [
{
"name": "asd-ASX030-vc-0",
"key_2": [
"A",
"B"
]
},
{
"name": "asd-ASX030-vc-1",
"key_2": [
"C",
"D"
]
}
]
}
...
}
我可以运行一个列表索引。
tasks:
- set_fact: set_fact: {"{{item[1]['name'].split('-')[2:] | join('_')}}":"{{item[1]['key_2']}}"}
loop: "{{ my_list }}"
我追求的是。
vc_0 = ["A", "B"]
vc_1 = ["C", "D"]
简单:
set_fact: {"{{item['name'].split('-')[2:] | `enter code here`join('_')}}":"{{item['key_2']}}"}
loop: "{{ my_list }}"
不起作用:
"The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'key_2'
我想避免对列表索引进行硬编码,如何动态地做到这一点?
答案 0 :(得分:2)
这是您要查找的代码(无格式)吗?
> cat play.yml
msg: asd-ASX030-vc-0 = [u'A', u'B']
msg: asd-ASX030-vc-1 = [u'C', u'D']
> ansible-playbook play.yml | grep msg
{{1}}
答案 1 :(得分:0)
我认为您使用Jinja表达式构造变量:
set_fact:
var2: {% for item in ansible_facts %}\
{{ item.name }}\
{% if not loop.last %},\
{% endif %}\
{% endfor %}