Можно ли ссылаться на переменные, передаваемые как 'item', и использовать их элементы при циклическом просмотре шаблона jinja? - PullRequest
0 голосов
/ 09 ноября 2019

При попытке перебрать переменные в ansible при создании шаблона jinja2 я не могу ссылаться на элементы в переменных после их передачи.

Я пробовал несколько перестановок, и яв недоумении, это, вероятно, просто, но я не вижу этого.

Рассматриваемый yaml:

---
- name: testing some crazyness
  hosts: localhost
  vars:
    domdb:
      dom1:
        ip: something
        mail: somethingelse
      dom2:
        ip: somethingdifferent
        mail: somethingelsedifferent
  tasks:
  - name:
    template:
      src: test.j2
      dest: "{{ item }}"
    with_items: "{{ domdb }}"  

Шаблон:

{{ item.ip. }}
{{ item.mail }}

I 'Я ожидаю, что это выведет два файла: dom1, содержащий: что-то что-то еще

и dom2, содержащий: что-то другое что-то elsedsedifferent

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Используйте dict2items для повторения словаря. Например

- name:
  template:
    src: test.j2
    dest: "{{ item.key }}"
  loop: "{{ domdb|dict2items }}"

Шаблон:

{{ item.value.ip }}
{{ item.value.mail }}
0 голосов
/ 09 ноября 2019

domdb - это словарь, а не список. Если вы пытаетесь перебрать словарь, вы перебираете только ключи. Таким образом, ваша задача эквивалентна:

  - template:
      src: test.j2
      dest: "{{ item }}"
    with_items:
      - dom1
      - dom2

Ваша попытка использовать item.ip и item.mail в вашей задаче должна привести к сообщению об ошибке AnsibleUndefinedVariable. Вы, вероятно, хотите это:

---
- name: testing some crazyness
  hosts: localhost
  vars:
    domdb:
      - name: dom1
        ip: something
        mail: somethingelse
      - name: dom2
        ip: somethingdifferent
        mail: somethingelsedifferent
  tasks:
    - name:
      template:
        src: test.j2
        dest: "{{ item.name }}"
      loop: "{{ domdb }}"  

В этом примере domdb - это список. Вместо этого вы можете сделать это вместо этого:

---
- name: testing some crazyness
  hosts: localhost
  vars:
    domdb:
      dom1:
        ip: something
        mail: somethingelse
      dom2:
        ip: somethingdifferent
        mail: somethingelsedifferent
  tasks:
    - template:
        src: test.j2
        dest: "{{ item.0 }}"
      loop: "{{ domdb.items()|list }}"

Здесь domdb снова является словарем, но используйте метод словаря .items(), чтобы создать список из (key, value) кортежей.

В обоих приведенных выше примерах я заменил устаревшую with_items на loop.

...