Управление подмножеством хостов в Ansible
В Ansible есть несколько способов гибко управлять, на каких хостах запускать playbook, без необходимости каждый раз редактировать inventory или создавать отдельные файлы. Это особенно полезно, когда у вас есть большой inventory, но вы хотите ограничить выполнение только на части хостов (например, только на ваших 3 Docker-хостах). Вот основные подходы:
Использование опции --limit в команде ansible-playbook:
- Это самый простой и быстрый способ. Вы можете указать список хостов или шаблон (pattern) прямо в командной строке, и playbook выполнится только на них, игнорируя остальных в inventory.
- Пример: Если ваши Docker-хосты называются
docker-host-1,docker-host-2,docker-host-3, то запустите playbook так:ansible-playbook -i inventories/your_inventory.ini playbooks/your_playbook.yml --limit "docker-host-1,docker-host-2,docker-host-3"- Здесь
--limitпринимает запятые для списка хостов или паттерны вродеdocker-host-*(если все хосты начинаются сdocker-host-и вы хотите захватить только первые три — уточните паттерн по именам). - Это не меняет inventory, просто фильтрует на лету. Идеально для разовых операций.
- Здесь
- Группы в inventory:
- Организуйте хосты в группы в вашем файле inventory (например,
inventories/production.iniили аналогичном). Это позволит ссылаться на группы вместо перечисления хостов каждый раз. - Пример структуры inventory (в формате INI):
[all_hosts] docker-host-1 docker-host-2 docker-host-3 other-host-1 other-host-2 [docker_hosts] docker-host-1 docker-host-2 docker-host-3- В playbook укажите
hosts: docker_hostsвместоhosts: all. - Запуск:
ansible-playbook -i inventories/production.ini playbooks/your_playbook.yml— выполнится только на группеdocker_hosts. - Если нужно иногда включить всех: используйте
hosts: allв playbook и--limit docker_hostsв команде для ограничения.
- В playbook укажите
- Организуйте хосты в группы в вашем файле inventory (например,
- Переменные и conditional в playbook:
- Если вы хотите один playbook, но с условиями: используйте
whenв задачах. - Пример: Определите переменную в group_vars или host_vars, например, в
group_vars/docker_hosts.ymlдобавьтеis_docker_host: true. Затем в задаче:when: is_docker_host | default(false). - Но для вашего случая
--limitили группы проще.
- Если вы хотите один playbook, но с условиями: используйте
- Другие советы:
- Если хосты динамические (например, из облака), используйте 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: Create /etc/docker directory if not exists
file:
path: /etc/docker
state: directory
mode: '0755'
- name: Write 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.ini playbooks/configure_docker_logs.yml --limit "docker-host-1,docker-host-2,docker-host-3"
- Это скопирует конфиг точно как в вашем примере (с tee и heredoc, но в Ansible-стиле).
- Если нужно проверить сначала: Добавьте
--check --diff. - Убедитесь, что в inventory хосты настроены с SSH-доступом и sudo без пароля (или используйте
--ask-become-pass).
