Ansible acumulando dicionários no fato da matriz via with_items

1

Eu tenho a seguinte tarefa (e uma tarefa de depuração):

- 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 }}"

Eu esperaria que o fato de centralized_logs acumulasse uma matriz de dicionários que contêm as strings interpoladas na instrução union, mas, em vez disso, recebo o seguinte (note que ele funciona para o segundo e terceiro itens, mas não o primeiro) :

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"}

Por que o primeiro valor não é interpolado corretamente?

Ansible versão 2.1.0.0.

    
por Codebeef 22.09.2016 / 15:01

1 resposta

2

O problema é que você tenta usar uma notação {{variável}} dentro de outra.

Um exemplo correto seria

- 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 }}"

Isso produz a seguinte saída:

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": [
        {
            "name": "one error log"
        }, 
        {
            "name": "two error log"
        }, 
        {
            "name": "three error log"
        }
    ]
}
    
por 26.09.2016 / 16:28

Tags