Например, при наличии инвентаря
оболочка> кошачьи хосты
хост01
хост02
хост03
и список
список:
- хост: host01
диск: диск0
ОС: 13.0
- хост: host02
диск: диск4
ОС: 13.0
- хост: host06
диск: hdisk7
ОС: 13.0
Создайте список разрешенных хостов
my_hosts: "{{ список|карта(атрибут='хост')|список }}"
дает
мои_хосты:
- хост01
- хост02
- хост06
Далее создайте словарь разрешенных хостов и версий ОС
my_os: "{{ list|items2dict(key_name='host', value_name='os') }}"
дает
мой_ос:
хост01: 13.0
хост02: 13.0
хост06: 13.0
Теперь приведенные ниже задачи удаляют файл условно и отображают зарегистрированные результаты.
- имя: Удалить файл из клиента
файл:
состояние: отсутствует
путь: /tmp/me
когда:
- inventory_hostname в my_hosts
- ansible_distribution_version ==
my_os[inventory_hostname]|по умолчанию('Нет')|строка
зарегистрироваться: файлопт
- отладка:
переменная: файлopt
дает
ЗАДАЧА [Удалить файл из клиента] ************************************************* **
пропуск: [host03]
хорошо: [host02]
хорошо: [хост01]
ЗАДАЧА [отладка] **************************************************** *****************
хорошо: [host01] =>
файлopt:
изменено: ложь
не удалось: ложь
путь: /tmp/me
состояние: отсутствует
хорошо: [host02] =>
файлopt:
изменено: ложь
не удалось: ложь
путь: /tmp/me
состояние: отсутствует
хорошо: [host03] =>
файлopt:
изменено: ложь
skip_reason: Условный результат был False
пропущено: правда
Как и ожидалось, хост03 который отсутствует в списке, был пропущен.
При желании создание динамической группы может быть более эффективным, если список разрешенных хостов будет намного меньше, чем список всех хостов. Например, создайте группу разрешенных хостов в первом воспроизведении и используйте ее во втором воспроизведении.
- имя: Создать группу my_hosts
хозяева: все
собрать_факты: правда
вары:
список:
- хост: host01
диск: диск0
ОС: 13.0
- хост: host02
диск: диск4
ОС: 13.0
- хост: host06
диск: hdisk7
ОС: 13.0
my_hosts: "{{ список|карта(атрибут='хост')|список }}"
my_os: "{{ list|items2dict(key_name='host', value_name='os') }}"
задачи:
- set_fact:
_my_os: "{{ ansible_distribution_version ==
my_os[inventory_hostname]|по умолчанию('Нет')|строка }}"
- имя: Создать группу my_hosts
add_host:
имя: "{{ элемент }}"
группы: my_hosts
цикл: "{{ hostvars|dict2items|
selectattr('ключ', 'в', my_hosts)|
selectattr('value._my_os')|
карта (атрибут = 'ключ') |
список }}"
run_once: правда
- имя: Удалить файл из my_hosts
хосты: my_hosts
сбор_фактов: ложь
задачи:
- имя: Удалить файл из клиента
файл:
состояние: отсутствует
путь: /tmp/me
зарегистрироваться: файлопт
- отладка:
переменная: файлopt
дает
ИГРАТЬ [Создать группу my_hosts] *********************************************
ЗАДАНИЕ [Сбор фактов] ***************************************************
хорошо: [host03]
хорошо: [хост01]
хорошо: [host02]
ЗАДАЧА [set_fact] **************************************************** ******
хорошо: [host03]
хорошо: [host02]
хорошо: [хост01]
ЗАДАЧА [Создать группу my_hosts] *******************************************
ок: [host01] => (item=host01)
ок: [host01] => (item=host02)
PLAY [Удалить файл с my_hosts] ***************************************
ЗАДАЧА [Удалить файл из клиента] ****************************************
хорошо: [хост01]
хорошо: [host02]
ЗАДАЧА [отладка] **************************************************** *********
хорошо: [host01] =>
файлopt:
изменено: ложь
не удалось: ложь
путь: /tmp/me
состояние: отсутствует
хорошо: [host02] =>
файлopt:
изменено: ложь
не удалось: ложь
путь: /tmp/me
состояние: отсутствует