Возможные вложенные циклы, как установить переменную внутреннего цикла на основе внешней переменной - PullRequest
0 голосов

У меня проблемы с вложенным циклом в ansible.

Я использую ansible 2.5.2 со следующими конфигурационными файлами:

файл хосты :

[group1]
host1
host2
host3
[group2]
hostA

file host_vars / host {N} (где N - номер каждого хоста в группе 1):

variable:
  - { line: "keyB" , file: "keyc"}
  - { line: "key2" , file: "key3"}

Мне нужно выполнить на hostA одну задачу для каждой строки в host_vars / host {N} .

в псевдокоде, нужно что-то вроде этого:

- name: modify file
  for host in groups['group1']:
    for item in host['variables']:
      lineinfile: "path={{ host }}/{{ item.file }} line={{ item.line }}"

Использование циклов jinja2 не работает:

- name: Modify files
  lineinfile: "{% for linea in hostvars[item]['variables'] %}
              path={{ item }}/{{ linea.file }}
              line={{ linea.line }}
              {% endfor %}"
  loop: "{{ groups['group1'] }}"

нормальные вложенные циклы также не работают, потому что внутренний цикл зависит от имени хоста:

- name: Modify files
  lineinfile: "path={{ item[0] }}/{{ item[1]['file'] }} line={{ item[1]['line'] }}"
  with_nested:
  - "{{ groups['group1'] }}"
  - "{{ hostvars[item[0]]['variables'] }}"

Есть еще один способ прокрутить вложенные циклы?

1 Ответ

0 голосов

Я решил свою проблему с помощью loop_control,

Я добавляю новый файл: inner.yml

- name: Modify files
  lineinfile: "path={{ outer_item }}/{{ item.file }} line={{ item.line }}"
  loop: "{{ hostvars[outer_item]['variables'] }}"

И определил файл моей задачи следующим образом

- include_tasks: inner.yml
  loop: "{{ groups['group1'] }}"
  loop_control:
    loop_var: outer_item

, которая решает мою проблему использования двух вложенных переменных в циклах.

...