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

Как выбрать из группы все хосты, кроме inventory_hostname?

У меня группа из двух хозяев. Я хочу передать задачу тому, кто не является текущим хостом.

Следующее ничего не соответствует и просто возвращает список моих первых двух хостов.

  - 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"
    ]
}