Определение

Предположим, у нас есть статический 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:
    ...