Skip to main content

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

611.png

ВЧасто в Ansible естьнужно запускать playbook не на всех хостах из inventory, а на их подмножестве. Например, вы хотите применить изменения только на серверах с Docker или только на группе баз данных. Ansible предоставляет несколько простых способов гибко управлять,фильтровать на каких хостах запускать playbook,хосты без необходимостиправки каждый раз редактировать inventory или создавать отдельные файлы. Это особенно полезно, когда у вас есть большой inventory, но вы хотите ограничить выполнение только на части хостов (например, только на ваших 3 Docker-хостах). Вот основные подходы:inventory.

Использование опции

1. Фильтрация с помощью --limit

в команде ansible-playbook:
  • Это самый

    Самый простой испособ быстрый способ. Вы можете указать список хостов или шаблон (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, простоработает фильтруеттолько напри лету. Идеальнозапуске.
    • Удобно для разовыхединичных операций.
  1. 2. Группы в inventory:

    • Организуйте
    хосты

    Хосты можно организовать в группыгруппы, чтобы ссылаться на них в вашемplaybook файлеили inventoryпри (например,запуске.

    Пример структуры inventories/production.ini:

    или аналогичном). Это позволит ссылаться на группы вместо перечисления хостов каждый раз.
  2. Пример структуры inventory (в формате INI):
    [all_hosts]
    docker-host-1
    docker-host-2
    docker-host-3
    other-db-host-1
    other-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):

    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.

  3. Если нужно иногда включить всех: используйте hosts: all в playbook и --limit docker_hosts в команде для ограничения.
  4. Переменные и conditional в playbook:
    • Если вы хотите один playbook, но с условиями: используйте when в задачах.
    • Пример: Определите переменную в group_vars или host_vars, например, в group_vars/docker_hosts.yml добавьте is_docker_host: true. Затем в задаче: when: is_docker_host | default(false).
    • Но для вашего случая --limit или группы проще.
  5. Другие советы:
    • Если хосты динамические (например, из облака), используйте 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 скопирует конфигразовые точнофильтры какпрямо в вашемкоманде.
  • Группы примерев inventory tee— удобный способ для постоянной структуры.
  • when и heredoc,переменные — для сложных сценариев.
  • Можно исключать хосты: --limit "!hostname".
  • Динамический inventory — для облаков и больших инфраструктур.

Этот подход масштабируется: один inventory может содержать сотни серверов, но вы всегда можете ограничить выполнение playbook до нужной группы или конкретного узла.


Хочешь, добавлю в Ansible-стиле).статью блок с советами по отладке playbook (флаги Если-v, нужно проверить сначала: Добавьте-vvv, --check --diff.

Убедитесь, что в inventory хосты настроены с SSH-доступом и sudo без пароля (или используйте, --ask-become-passdiff).?