У меня есть следующая задача (и задача отладки):
- 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.
Проблема в том, что вы пытаетесь использовать обозначение {{переменная}} внутри другого.
Правильный пример:
- 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"
}
]
}