Определение
Предположим, у нас есть статический inventory с 10 хостами, однако мы точно знаем, что часть из этих хостов будет недоступна
Конечно, можно использовать динамический инвентори и в процессе выполнения плейбука сделать ansible.builtin.meta: refresh_inventory
Но это будет справедливо лишь при запуске через CLI (ansible-playbook
/ansible-navigator
/ansible
), AWX/AAC не поддерживает ansible.builtin.meta: refresh_inventory
(см. https://github.com/ansible/awx/issues/7276) и также не поддерживает передачу extra_vars
в динамический инвентори (см. https://github.com/ansible/awx/issues/13004)
В более простых случаях поможет возможность использования jinja прямо в поле hosts:
плея, например:
- name: Install FreeIPA
hosts: "{{ 'freeipa_hosts' if deploy_freeipa else 'none' }}"
become: true
tasks:
...
То есть если значение deploy_freeipa
на глобальном уровне true
, то задание будет выполнено, а если нет, то будет пропущено
Однако, очень часто удобно использовать группу all
для выполнения задач на всех хостах из инвентори, что в нашем случае невозможно (мы обратимся к несуществующим хостам и получим ошибку UNREACHABLE
), как вариант — использовать ignore_unreachable: true
, но тогда придется тратить время на ожидание в каждой таске плея
В рамках одного плея можно сделать так:
- name: Configure DNS on all hosts
hosts: all
gather_facts: false
become: true
tasks:
- name: Remove unused hosts
block:
- name: Remove unused hosts
ansible.builtin.wait_for_connection:
timeout: 30
rescue:
# Таска ниже нужна для того, чтобы результат выполнения плейбука не считался FAILED
- name: Clean errors from them
ansible.builtin.meta: clear_host_errors
- name: End play for these hosts
ansible.builtin.meta: end_host
...
В таком варианте — недоступные хосты будут просто убраны из этого плея, но а что если таких плеев несколько?
Тогда можно создать группу из недоступных хостов и в последующих плеях использовать host patterns (ссылка ведет на пост)
- name: Configure DNS on all hosts
hosts: all
gather_facts: false
become: true
tasks:
- name: Remove unused hosts
block:
- name: Remove unused hosts
ansible.builtin.wait_for_connection:
timeout: 30
rescue:
- name: Create host group for failed host
ansible.builtin.group_by:
key: failed_hosts
# Таска ниже нужна для того, чтобы результат выполнения плейбука не считался FAILED
- name: Clean errors from them
ansible.builtin.meta: clear_host_errors
- name: End play for these hosts
ansible.builtin.meta: end_host
...
- name: Configure HOSTNAME on all hosts
hosts: all:!failed_hosts
gather_facts: false
become: true
tasks:
...