Новое в анзибль, не могу найти ссылку на мою проблему, которая не кажется такой уж редкой ..
У меня есть два хоста в одной группе, каждый со своими переменными, например:
[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]