Шаблоны: выбор узлов и групп
При выполнении 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
Порядок обработки шаблонов
Обработка выполняется в особом порядке:
-
:и, &!
Этот порядок относится только к порядку обработки внутри каждой операции: 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