Ответ
В 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