Skip to main content

Управление подмножеством хостов в Ansible

611.png

Часто в 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):

  1. Определите переменную в group_vars/docker_hosts.yml:
    is_docker_host: true
  2. Используйте условие в задаче:
    - 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 до нужной группы или конкретного узла.