Spec-Zone.ru › Ansible

Шаблоны: нацеливание на хосты и группы

При выполнении Ansible через команду ad hoc или выполнении playbook, необходимо выбрать управляемые узлы или группы, на которые нужно воздействовать. Шаблоны позволяют запускать команды и playbooks на определённых хостах и/или группах в вашем инвентаре. Шаблон Ansible может ссылаться на один хост, IP-адрес, группу инвентаря, набор групп или все хосты в вашем инвентаре. Шаблоны очень гибкие — вы можете исключить или потребовать подмножества хостов, использовать подстановочные знаки или регулярные выражения и многое другое. Ansible выполняется на всех хостах инвентаря, включённых в шаблон.

  • Использование шаблонов
  • Общие шаблоны
  • Ограничения шаблонов
  • Порядок обработки шаблонов
  • Дополнительные параметры шаблонов

    • Использование переменных в шаблонах
    • Использование позиции группы в шаблонах

      • Вырезка по определённым элементам
      • Вырезка с начальными и конечными точками
    • Использование регулярных выражений в шаблонах
  • Шаблоны и команды ad hoc
  • Шаблоны и флаги ansible-playbook

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

Вы используете шаблон почти каждый раз, когда выполняете команду ad hoc или playbook. Шаблон — единственный элемент команды ad hoc, у которого нет флага. Обычно это второй элемент:

ansible <pattern> -m <module_name> -a "<module options>"

Например:

ansible webservers -m service -a "name=httpd state=restarted"

В playbook шаблон — содержимое строки hosts: для каждого выполнения:

- name: <play_name>
  hosts: <pattern>

Например:

- name: restart webservers
  hosts: webservers

Поскольку вы часто хотите запустить команду или playbook сразу на нескольких хостах, шаблоны часто ссылаются на группы инвентаря. Обе команды ad hoc и playbook выше будут выполняться на всех машинах в группе webservers.

Общие шаблоны

В этой таблице перечислены распространённые шаблоны для выбора хостов и групп инвентаря.

Описание

Шаблон(ы)

Целевые объекты

Все хосты

all (или *)

Один хост

host1

Несколько хостов

host1:host2 (или host1,host2)

Одна группа

webservers

Несколько групп

webservers:dbservers

все хосты в webservers плюс все хосты в dbservers

Исключение групп

webservers:!atlanta

все хосты в webservers, за исключением тех, что в atlanta

Пересечение групп

webservers:&staging

любые хосты в webservers, которые также находятся в staging

Примечание

Вы можете использовать запятую (,) или двоеточие (:) для разделения списка хостов. Запятая предпочтительнее при работе со диапазонами и IPv6-адресами.

После того, как вы знаете основные шаблоны, вы можете их комбинировать. Например:

webservers:dbservers:&staging:!phoenix

нацелено на все машины в группах ‘webservers’ и ‘dbservers’, которые также находятся в группе ‘staging’, за исключением машин в группе ‘phoenix’.

Вы можете использовать шаблоны с подстановкой символов для FQDN или IP-адресов, если хосты в вашем инвентаре названы FQDN или IP-адресом:

192.0.*
*.example.com
*.com

Вы можете смешивать шаблоны с подстановкой символов и группы одновременно:

one*.com:dbservers

Ограничения шаблонов

Шаблоны зависят от инвентаря. Если хост или группа не указаны в вашем инвентаре, вы не можете использовать шаблон для их выбора. Если ваш шаблон включает IP-адрес или имя хоста, которые не указаны в инвентаре, вы увидите ошибку, подобную этой:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com

Ваш шаблон должен соответствовать синтаксису вашего инвентаря. Если вы определили хост как псевдоним:

atlanta:
  hosts:
    host1:
      http_port: 80
      maxRequestsPerChild: 808
      ansible_host: 127.0.0.2

вы должны использовать псевдоним в своём шаблоне. В примере выше вы должны использовать host1 в вашем шаблоне. Если вы используете IP-адрес, вы снова получите ошибку:

[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2

Порядок обработки шаблонов

Обработка немного специфическая и происходит в следующем порядке:

  1. : и ,
  2. &
  3. !

Эта позиционировка учитывает только порядок обработки внутри каждой операции: a:b:&c:!d:!e == &c:a:!d:b:!e == !d:a:!e:&c:b

Всё это приводит к следующему:

Хост в/находится в (a или b) И хост в/находится во всех(c) И хост не в/не находится во всех(d, e).

Теперь a:b:!e:!d:&c — это небольшое изменение, так как !e обрабатывается до !d, хотя это не сильно меняет результат:

Хост в/находится в (a или b) И хост в/находится во всех(c) И хост не в/не находится во всех(e, d).

Дополнительные параметры шаблонов

Общие шаблоны, описанные выше, удовлетворят большинство ваших потребностей, но Ansible предлагает несколько других способов определить хосты и группы, которые вы хотите выбрать.

Использование переменных в шаблонах

Вы можете использовать переменные для передачи спецификаторов групп с аргументом -e в ansible-playbook:

webservers:!{{ excluded }}:&{{ required }}

Использование позиции группы в шаблонах

Вы можете определить хост или подмножество хостов по его позиции в группе. Например, если у вас есть следующая группа:

[webservers]
cobweb
webbing
weber

вы можете использовать индексы для выбора отдельных хостов или диапазонов в группе webservers.

Вырезка по определённым элементам

  • Операция: s[i]
  • Результат: i-th элемент s, где начальный индекс 0

Если i отрицательное, индекс относится к концу последовательности s: len(s) + i заменяется. Однако -0 является 0.

webservers[0]       # == cobweb
webservers[-1]      # == weber

Вырезка с начальными и конечными точками

  • Операция: s[i:j]
  • Результат: срез s с i по j

Срез s с i по j определяется как последовательность элементов с индексом k, где i <= k <= j. Если i опущено, использовать 0. Если j опущено, использовать len(s). Срез, в котором отсутствуют как i, так и j, приводит к недопустимому шаблону хоста. Если i больше j, срез пустой. Если i равно j, используется s[i].

webservers[0:2]     # == webservers[0],webservers[1],webservers[2]
                    # == cobweb,webbing,weber
webservers[1:2]     # == webservers[1],webservers[2]
                    # == webbing,weber
webservers[1:]      # == webbing,weber
webservers[:3]      # == cobweb,webbing,weber

Использование регулярных выражений в шаблонах

Вы можете указать шаблон как регулярное выражение, начав шаблон с ~:

~(web|db).*\.example\.com

Шаблоны и команды ad hoc

Вы можете изменить поведение шаблонов, определённых в командах ad hoc, с помощью параметров командной строки. Вы также можете ограничить хосты, на которые вы нацелены в конкретном запуске, с флагом --limit.

  • Ограничение до одного хоста
$ ansible all -m <module> -a "<module options>" --limit "host1"
  • Ограничение до нескольких хостов
$ ansible all -m <module> -a "<module options>" --limit "host1,host2"
  • Ограничение с отрицанием. Обратите внимание, что одинарные кавычки ОБЯЗАТЕЛЬНО должны использоваться для предотвращения интерполяции bash.
$ ansible all -m <module> -a "<module options>" --limit 'all:!host1'
  • Ограничение до группы хостов
$ ansible all -m <module> -a "<module options>" --limit 'group1'

Шаблоны и флаги ansible-playbook

Вы можете изменить поведение шаблонов, определённых в плейбуках, используя параметры командной строки. Например, вы можете запустить плейбук, который определяет hosts: all на одном хосте, указав -i 127.0.0.2, (обратите внимание на завершающую запятую). Это работает даже если целевой хост не определён в вашем инвентаре, но этот метод НЕ будет читать ваш инвентарь для переменных, связанных с этим хостом, и любые переменные, необходимые плейбуку, необходимо будет указать вручную в командной строке. Вы также можете ограничить хосты, на которые вы нацеливаетесь в конкретном запуске, используя флаг --limit, который будет ссылаться на ваш инвентарь:

ansible-playbook site.yml --limit datacenter2

Наконец, вы можете использовать --limit для чтения списка хостов из файла, добавив префикс @ к имени файла:

ansible-playbook site.yml --limit @retry_hosts.txt

Если RETRY_FILES_ENABLED установлено в True, файл .retry будет создан после выполнения ansible-playbook запуска, содержащий список не удавшихся хостов со всех плей. Этот файл перезаписывается каждый раз, когда ansible-playbook завершает выполнение.

ansible-playbook site.yml --limit @site.retry

Чтобы применить свои знания о шаблонах с командами и плейбуками Ansible, прочитайте Введение в ad hoc команды и Плейбуки Ansible.

См. также

Введение в ad hoc команды

Примеры основных команд

Работа с плейбуками

Изучение языка управления конфигурацией Ansible

Общение

У вас есть вопросы? Нужна помощь? Хотите поделиться своими идеями? Посетите руководство по общению Ansible

© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/inventory_guide/intro_patterns.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API