Назад | Перейти на главную страницу

ansible: запускать задачу несколько раз на одном хосте, используя переменные с другого

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

У меня есть два хоста в одной группе, каждый со своими переменными, например:

[myHosts]
host1  a=1  b=10
host2  a=2  b=20

Теперь у меня есть задача, которую нужно выполнить дважды на host1 только один раз с host1переменных, а второй раз - со значением a из host1, и b из host2. Если я напишу так:

- role: my_role
      vars:
        a_val: {{ a }}
        b_val: {{ b }}
      loop: "{{ groups['myHosts'] }}"
      when: inventory_hostname in groups['myHosts'][0]

я получил a_val и b_val заселен host1 только значения (что подходит для a_val, не для b_val).

Я знаю, что, похоже, нет причин, по которым я мог бы просто вызвать одну и ту же задачу дважды, ссылаясь на правильное значение b с некоторыми доступными магическими варами (hostvars[groups['myHosts'][1]]['b'] будет делать трюк, например), но завтра может быть 10 и это будет раздражать (в этом случае when состояние все равно будет в порядке, так как все будет выполняться всегда там).

Как я могу обобщить, чтобы иметь b_val с правильным значением?

Вопрос: «Задача, которую нужно выполнить дважды только на host1, один раз с переменными host1, а второй раз со значением a от host1 и b от host2».

А: hostvars позволяет получить доступ к переменным для другого хоста. Например спектакль

- hosts: host1
  tasks:
    - debug:
        msg: "a:{{ item.a }} b:{{ item.b }}"
      loop:
        - "{'a': {{ a }}, 'b': {{ b }} }"
        - "{'a': {{ a }}, 'b': {{ hostvars['host2'].b }} }"

дает

ok: [host1] => (item={'a': 1, 'b': 10}) => {
    "msg": "a:1 b:10"
}
ok: [host1] => (item={'a': 1, 'b': 20}) => {
    "msg": "a:1 b:20"
}

Вот что мне было нужно: https://stackoverflow.com/a/32336359/827818

Я составил вот такой отдельный список:

bs_list:
  host1:
    b: val1
  host2:
    b: val2

включены с pre_tasks, а потом

- debug: 
    msg: "{{ item.value.b }}"
  with_dict: "{{ bs_list }}"
  when: inventory_hostname in groups['myHosts'][0]