Как ограничить набор хостов для выполнения плейбука Ansible?

Ответ

В Ansible есть несколько практических способов ограничить выполнение задач конкретным набором хостов.

1. Флаг --limit при запуске плейбука Самый частый способ — указать шаблон или группу при запуске.

# Выполнить только на хостах из группы 'webservers'
ansible-playbook deploy.yml --limit webservers

# Выполнить на хосте с конкретным именем
ansible-playbook deploy.yml --limit web01.prod

# Использовать шаблоны (например, все хосты в .prod домене)
ansible-playbook deploy.yml --limit '*.prod'

# Комбинировать несколько групп через двоеточие
ansible-playbook deploy.yml --limit 'webservers:databases'

2. Динамическое определение хостов в самом плейбуке Можно параметризовать целевые хосты, используя переменные.

# playbook.yml
- hosts: "{{ target | default('all') }}"
  tasks:
    - debug:
        msg: "Running on {{ inventory_hostname }}"

Запуск: ansible-playbook playbook.yml -e "target=webservers"

3. Использование тегов (tags) для фильтрации задач Теги позволяют запускать не весь плейбук, а только помеченные задачи, но они всё равно выполнятся на всех хостах, указанных в hosts:.

- hosts: all
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
      tags:
        - nginx
        - install

    - name: Configure firewall
      ufw:
        rule: allow
        port: '80'
      tags: firewall

Запуск только задач с тегом nginx: ansible-playbook playbook.yml --tags nginx.

4. Предварительный фильтр с помощью --list-hosts Перед запуском полезно проверить, на каких хостах будет выполняться плейбук с учётом лимита: ansible-playbook playbook.yml --limit webservers --list-hosts