![Ansible 通过 with_items 在数组事实中累积字典](https://linux22.com/image/690449/Ansible%20%E9%80%9A%E8%BF%87%20with_items%20%E5%9C%A8%E6%95%B0%E7%BB%84%E4%BA%8B%E5%AE%9E%E4%B8%AD%E7%B4%AF%E7%A7%AF%E5%AD%97%E5%85%B8.png)
我有以下任务(和调试任务):
- name: get list of error logs
set_fact:
centralised_logs: "{{ centralised_logs | default([]) | union([{'name': '{{ item }} error log'}])}}"
with_items:
- "one"
- "two"
- "three"
- debug: msg="{{ centralised_logs }}"
我希望 centralised_logs 事实能够积累一个包含 union 语句中插值字符串的字典数组,但是,我得到的却是以下内容(请注意,它适用于第二项和第三项,但不适用于第一项):
TASK [nginx : get list of error logs] ******************************************
ok: [127.0.0.1] => (item=one)
ok: [127.0.0.1] => (item=two)
ok: [127.0.0.1] => (item=three)
TASK [nginx : debug] ***********************************************************
fatal: [127.0.0.1]: FAILED! => {"failed": true, "msg": "[{'name': u'two error log'}, {'name': u'three error log'}, {'name': u'{{ item }} error log'}]: 'item' is undefined"}
为什么第一个值无法正确插值?
Ansible 版本 2.1.0.0。
答案1
问题在于,您尝试在另一个变量中使用 {{ variable }} 符号。
正确的例子是
- name: get list of error logs
set_fact:
centralised_logs: "{{ centralised_logs | default([]) | union([{'name': item + ' error log'}])}}"
with_items:
- "one"
- "two"
- "three"
- debug: msg="{{ centralised_logs }}"
这将产生以下输出:
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": [
{
"name": "one error log"
},
{
"name": "two error log"
},
{
"name": "three error log"
}
]
}