Skip to main content

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

611.png

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

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

    Использование опции --limit в команде ansible-playbook:

      Это самый простой и быстрый способ. Вы можете указать список хостов или шаблон (pattern) прямо в командной строке, и playbook выполнится только на них, игнорируя остальных в inventory. Пример: Если ваши Docker-хосты называются 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:

          Организуйте хосты в группы в вашем файле 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
          
            В playbook укажите 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:

              Если вы хотите один playbook, но с условиями: используйте when в задачах. Пример: Определите переменную в group_vars или host_vars, например, в group_vars/docker_hosts.yml добавьте is_docker_host: true. Затем в задаче: when: is_docker_host | default(false). Но для вашего случая --limit или группы проще.

              Другие советы:

                Если хосты динамические (например, из облака), используйте dynamic inventory скрипты. Для тестирования: Добавьте --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, n-1-dsw3docker-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 "n-1-dsw1,n-1-dsw2,n-1-dsw3"docker-host-1,docker-host-2,docker-host-3"
                
                  Это скопирует конфиг точно как в вашем примере (с tee и heredoc, но в Ansible-стиле). Если нужно проверить сначала: Добавьте --check --diff. Убедитесь, что в inventory хосты настроены с SSH-доступом и sudo без пароля (или используйте --ask-become-pass).

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