У меня группа из двух хозяев. Я хочу передать задачу тому, кто не является текущим хостом.
Следующее ничего не соответствует и просто возвращает список моих первых двух хостов.
- debug: msg="{{ groups['web-servers'] | select('match', '^(?!\{\{\ inventory_hostname\ \}\}$).+') | list }}"
Я думаю, что это проблема, но я не могу этого понять.
Вариантом было бы использовать фильтр разницы. Ниже приведен пример его использования.
> cat test-difference-01.yml
- hosts: localhost
gather_facts: no
vars:
web_servers:
- web-server-01
- web-server-02
- web-server-09
inventory_hostname:
- web-server-02
tasks:
- set_fact:
delegate_to_hosts: "{{ web_servers | difference(inventory_hostname) }}"
- debug:
msg : "{{ delegate_to_hosts }}"
.
> ansible-playbook test-difference-01.yml | grep -A 3 msg
"msg": [
"web-server-01",
"web-server-09"
]
Вам не нужно указывать регулярное выражение с отрицательным просмотром вперед. Вместо этого используйте reject
фильтр.
Также с equalto
test, вам не нужно заключать строку в ^
и $
:
- debug:
msg: "{{ groups['web-servers'] | reject('equalto', inventory_hostname) | list }}"
Я думаю, проблема в подстановке переменных (или ее отсутствии) в шаблоне регулярного выражения. Вы можете определить шаблон отдельно и передать его фильтру (обратите внимание, что я немного изменил ваше регулярное выражение):
- set_fact: pattern="^(?!{{ inventory_hostname }}).+$"
- debug: msg="{{ groups['web-servers'] | select('match', pattern) | list }}"
Результат:
TASK [debug : debug] ******************************************
ok: [foo] => {
"msg": [
"bar",
"baz"
]
}
ok: [bar] => {
"msg": [
"foo",
"baz"
]
}
ok: [baz] => {
"msg": [
"foo",
"bar"
]
}