Управление подмножеством хостов в Ansible
ВЧасто в Ansible естьнужно запускать playbook не на всех хостах из inventory, а на их подмножестве. Например, вы хотите применить изменения только на серверах с Docker или только на группе баз данных. Ansible предоставляет несколько простых способов гибко управлять,фильтровать на каких хостах запускать playbook,хосты без необходимостиправки каждый раз редактировать inventory или создавать отдельные файлы. Это особенно полезно, когда у вас есть большой inventory, но вы хотите ограничить выполнение только на части хостов (например, только на ваших 3 Docker-хостах). Вот основные подходы:inventory.
Использование
опции
1. Фильтрация с помощью --limit
Это самыйСамый простой
испособбыстрый способ. Вы можете— указать список хостов или шаблон(pattern)прямо в команднойстроке, и playbookстроке.
Playbook выполнится только наних,указанныхигнорируяхостах,остальныхостальныевбудутinventory.Пример:проигнорированы.Если ваши Docker-хосты называютсяdocker-host-1,docker-host-2,docker-host-3, то запустите playbook так:ansible-playbook -i inventories/your_inventory.production.ini playbooks/your_playbook.deploy.yml --limit "docker-host-1,docker-host-2,docker-host-3"- Хосты перечисляются через запятую.
ЗдесьМожно использовать шаблон:--limit "docker-host-*"выберет все хосты с префиксомdocker-host-.--limitпринимает запятые для списка хостов или паттерны вродеdocker-host-*(если все хосты начинаются сdocker-host-и вы хотите захватить только первые три — уточните паттерн по именам).Этоне меняет сам inventory,простоработаетфильтруеттольконаприлету. Идеальнозапуске.- Удобно для
разовыхединичных операций.
-
2. Группы в inventory
:Организуйте
хостыХосты можно организовать в
группыгруппы, чтобы ссылаться на них ввашемplaybookфайлеилиinventoryпри(например,запуске.Пример структуры
inventories/production.ini:или аналогичном). Это позволит ссылаться на группы вместо перечисления хостов каждый раз. Пример структуры inventory (в формате INI):[all_hosts] docker-host-1 docker-host-2 docker-host-3other-db-host-1other-db-host-2 [docker_hosts] docker-host-1 docker-host-2 docker-host-3Теперь вы можете:
ВУказать группу в playbook:hosts: docker_hosts- Либо запустить playbook
укажитена группе:hosts: docker_hostsвместоhosts: all. Запуск:ansible-playbook -i inventories/production.ini playbooks/your_playbook.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.Если нужно иногда включить всех: используйтеhosts: allв playbook и--limit docker_hostsв команде для ограничения.Переменные и conditional в playbook:Если вы хотите один playbook, но с условиями: используйтеwhenв задачах.Пример: Определите переменную в group_vars или host_vars, например, вgroup_vars/docker_hosts.ymlдобавьте.is_docker_host: trueЗатем в задаче:when: is_docker_host | default(false).Но для вашего случая--limitили группы проще.
Другие советы:Если хосты динамические (например, из облака), используйте dynamic inventory скрипты.Для тестирования: Добавьте--checkв команду, чтобы playbook симулировал изменения без применения.Если нужно исключить хосты:--limit '!other-host-1,!other-host-2'(с восклицательным знаком для negation).
Это позволит вам легко переключаться между "только на 3 Docker-хостах" и "на всех".
Конкретная операция: Копирование конфигурации Docker на хосты docker-host-(1,2,3)
Для вашей задачи (создать /etc/docker, записать daemon.json с логами, рестартить Docker) создайте отдельный playbook. Я предполагаю, что хосты — docker-host-1, docker-host-2, docker-host-3 (если имена другие, подставьте). Playbook выполнит всё с правами sudo (через become: yes).
Создайте файл, например,Создадим playbooks/configure_docker_logs.yml:
---
- name: Configure Docker logging
on specific hosts
hosts: all # Или укажите группу, если она есть, например: docker_hosts
become: yes
# Для sudo
tasks:
- name: CreateEnsure /etc/docker directory if not exists
file:
path: /etc/docker
state: directory
mode: '0755'
- name: WriteConfigure daemon.json configuration
copy:
dest: /etc/docker/daemon.json
content: |
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
mode: '0644'
- name: Restart Docker
service
systemd:
name: docker
state: restarted
Запуск (только на ваших 3 хостах):Запуск:
ansible-playbook -i inventories/your_inventory.production.ini playbooks/configure_docker_logs.yml --limit "docker-host-1,docker-host-2,docker-host-3"docker_hosts
Проверка без применения изменений:
ansible-playbook -i inventories/production.ini playbooks/configure_docker_logs.yml --limit docker_hosts --check --diff
Кратко
Это--limitскопирует—конфигразовыеточнофильтрыкакпрямо ввашемкоманде.- Группы
примерев(сinventorytee— удобный способ для постоянной структуры. whenиheredoc,переменные — для сложных сценариев.- Можно исключать хосты:
--limit "!hostname". - Динамический inventory — для облаков и больших инфраструктур.
Этот подход масштабируется: один inventory может содержать сотни серверов, но вы всегда можете ограничить выполнение playbook до нужной группы или конкретного узла.
Хочешь, добавлю в Ansible-стиле).статью блок с советами по отладке playbook (флаги , Если-vнужно проверить сначала: Добавьте-vvv, --check --diff.
--ask-become-passdiff)
