Skip to main content

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

611.png

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

Если у вас есть вопросы по настройке или ошибки, предоставьте больше деталей!