Управление подмножеством хостов в Ansible
Часто в Ansible нужно запускать playbook не на всех хостах из inventory, а на их подмножестве. Например, вы хотите применить изменения только на серверах с Docker или только на группе баз данных. Ansible предоставляет несколько простых способов гибко фильтровать хосты без правки inventory.
1. Фильтрация с помощью --limit
Самый простой способ — указать список хостов или шаблон прямо в командной строке.
Playbook выполнится только на указанных хостах, остальные будут проигнорированы.
ansible-playbook -i inventories/production.ini playbooks/deploy.yml --limit "docker-host-1,docker-host-2,docker-host-3"
- Хосты перечисляются через запятую.
- Можно использовать шаблон:
--limit "docker-host-*"выберет все хосты с префиксомdocker-host-. --limitне меняет сам inventory, работает только при запуске.- Удобно для единичных операций.
2. Группы в inventory
Хосты можно организовать в группы, чтобы ссылаться на них в playbook или при запуске.
Пример структуры inventories/production.ini:
[all_hosts]
docker-host-1
docker-host-2
docker-host-3
db-host-1
db-host-2
[docker_hosts]
docker-host-1
docker-host-2
docker-host-3
Теперь вы можете:
- Указать группу в playbook:
hosts: docker_hosts - Либо запустить playbook на группе:
ansible-playbook -i inventories/production.ini playbooks/deploy.yml --limit docker_hosts
3. Условия в задачах
Для гибкой логики можно использовать условные операторы (when):
- Определите переменную в
group_vars/docker_hosts.yml:is_docker_host: true - Используйте условие в задаче:
- name: Do something only on Docker hosts debug: msg: "This is a Docker host" when: is_docker_host | default(false)
4. Исключение хостов
Фильтрация работает и в обратную сторону. Чтобы исключить хосты:
ansible-playbook -i inventories/production.ini playbooks/deploy.yml --limit "!db-host-1,!db-host-2"
5. Динамический inventory
Если хосты динамические (например, из AWS, GCP, OpenStack), используйте Dynamic Inventory.
Это позволяет автоматически подгружать список хостов из облачных провайдеров или API.
6. Пример: настройка логов Docker
Допустим, нужно настроить логирование Docker только на группе docker_hosts. Создадим playbooks/configure_docker_logs.yml:
---
- name: Configure Docker logging
hosts: docker_hosts
become: yes
tasks:
- name: Ensure /etc/docker directory exists
file:
path: /etc/docker
state: directory
mode: '0755'
- name: Configure daemon.json
copy:
dest: /etc/docker/daemon.json
content: |
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
mode: '0644'
- name: Restart Docker
systemd:
name: docker
state: restarted
Запуск:
ansible-playbook -i inventories/production.ini playbooks/configure_docker_logs.yml --limit docker_hosts
Проверка без применения изменений:
ansible-playbook -i inventories/production.ini playbooks/configure_docker_logs.yml --limit docker_hosts --check --diff
Кратко
--limit— разовые фильтры прямо в команде.- Группы в inventory — удобный способ для постоянной структуры.
whenи переменные — для сложных сценариев.- Можно исключать хосты:
--limit "!hostname". - Динамический inventory — для облаков и больших инфраструктур.
Этот подход масштабируется: один inventory может содержать сотни серверов, но вы всегда можете ограничить выполнение playbook до нужной группы или конкретного узла.
Хочешь, добавлю в статью блок с советами по отладке playbook (флаги -v, -vvv, --check, --diff)?
