Spec-Zone.ru › Ansible

Шаблоны: выбор узлов и групп

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

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

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

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

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

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

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

Например:

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

В плейбуке шаблон — это содержимое строки hosts: для каждого задания:

- name: <play_name>
  hosts: <pattern>

Например:

- name: restart webservers
  hosts: webservers

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

Распространённые шаблоны

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

Описание

Шаблон(ы)

Целевые узлы

Все узлы

all (or *)

Один узел

host1

Несколько узлов

host1:host2 (or host1,host2)

Одна группа

webservers

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

webservers:dbservers

все узлы из webservers, а также все узлы из dbservers

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

webservers:!atlanta

все узлы из webservers, кроме узлов из atlanta

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

webservers:&staging

узлы из webservers, которые также входят в staging

Примечание

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

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

webservers:dbservers:&staging:!phoenix

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

Можно использовать шаблоны с подстановочными знаками для полных доменных имён или IP-адресов, если в инвентаре узлы указаны по полному доменному имени или 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

В результате во всех этих случаях получится следующее:

Host in/is (a or b) AND host in/is all(c) AND host NOT in/is all(d, e).

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

Host in/is (a or b) AND host in/is all(c) AND host NOT in/is all(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

Шаблоны и разовые команды

Поведение шаблонов, заданных в разовых командах, можно изменить с помощью параметров командной строки. Также можно ограничить набор узлов для конкретного запуска с помощью флага --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, после запуска ansible-playbook будет создан файл .retry со списком узлов, на которых произошла ошибка во всех заданиях. Этот файл перезаписывается после каждого завершения работы ansible-playbook.

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

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

См. также

Введение в разовые команды

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

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

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

Общение

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

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

Spec-Zone.ru

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