Управление подмножеством хостов в Ansible
Управление подмножеством хостов в Ansible
В Ansible есть несколько способов гибко управлять, на каких хостах запускать playbook, без необходимости каждый раз редактировать inventory или создавать отдельные файлы. Это особенно полезно, когда у вас есть большой inventory, но вы хотите ограничить выполнение только на части хостов (например, только на ваших 3 Docker-хостах). Вот основные подходы:
Использование опции --limit в команде ansible-playbook:
n-1-dsw1docker-host-1, n-1-dsw2docker-host-2, n-1-dsw3docker-host-3, то запустите playbook так:
ansible-playbook -i inventories/your_inventory.ini playbooks/your_playbook.yml --limit "n-1-dsw1,n-1-dsw2,n-1-dsw3"docker-host-1,docker-host-2,docker-host-3"
--limit принимает запятые для списка хостов или паттерны вроде n-1-dsw*docker-host-* (если все хосты начинаются с n-1-dswdocker-host- и вы хотите захватить только первые три — уточните паттерн по именам).
Это не меняет inventory, просто фильтрует на лету. Идеально для разовых операций.
Группы в inventory:
inventories/production.ini или аналогичном). Это позволит ссылаться на группы вместо перечисления хостов каждый раз.
Пример структуры inventory (в формате INI):
[all_hosts]
n-1-dsw1docker-host-1
n-1-dsw2docker-host-2
n-1-dsw3docker-host-3
other-host1host-1
other-host2host-2
[docker_hosts]
n-1-dsw1docker-host-1
n-1-dsw2docker-host-2
n-1-dsw3docker-host-3
hosts: docker_hosts вместо hosts: all.
Запуск: ansible-playbook -i inventories/production.ini playbooks/your_playbook.yml — выполнится только на группе docker_hosts.
Если нужно иногда включить всех: используйте hosts: all в playbook и --limit docker_hosts в команде для ограничения.
Переменные и conditional в playbook:
when в задачах.
Пример: Определите переменную в group_vars или host_vars, например, в group_vars/docker_hosts.yml добавьте is_docker_host: true. Затем в задаче: when: is_docker_host | default(false).
Но для вашего случая --limit или группы проще.
Другие советы:
--check в команду, чтобы playbook симулировал изменения без применения.
Если нужно исключить хосты: --limit '!other-host1,host-1,!other-host2'host-2' (с восклицательным знаком для negation).
Это позволит вам легко переключаться между "только на 3 Docker-хостах" и "на всех".
Конкретная операция: Копирование конфигурации Docker на хосты n-1-dsw(docker-host-(1,2,3)
Для вашей задачи (создать /etc/docker, записать daemon.json с логами, рестартить Docker) создайте отдельный playbook. Я предполагаю, что хосты — , n-1-dsw1docker-host-1, n-1-dsw2docker-host-2 (если имена другие, подставьте). Playbook выполнит всё с правами sudo (через n-1-dsw3docker-host-3become: 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 "n-1-dsw1,n-1-dsw2,n-1-dsw3"docker-host-1,docker-host-2,docker-host-3"
--check --diff.
Убедитесь, что в inventory хосты настроены с SSH-доступом и sudo без пароля (или используйте --ask-become-pass).
Если у вас есть вопросы по настройке или ошибки, предоставьте больше деталей!
