Шаблоны: нацеливание на хосты и группы
При выполнении Ansible через команду ad-hoc или запуск playbooks, необходимо выбрать управляемые узлы или группы, на которые нужно выполнить действия. Шаблоны позволяют выполнять команды и playbooks на конкретных хостах и/или группах в вашем инвентаре. Шаблон Ansible может ссылаться на отдельный хост, IP-адрес, группу инвентаризации, набор групп или все хосты в вашем инвентаре. Шаблоны очень гибкие — вы можете исключить или потребовать подмножества хостов, использовать подстановочные знаки или регулярные выражения и многое другое. Ansible выполняется на всех хостах инвентаризации, включённых в шаблон.
- Использование шаблонов
- Общие шаблоны
- Ограничения шаблонов
- Расширенные параметры шаблонов
- Шаблоны и флаги 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:
host1:
http_port: 80
maxRequestsPerChild: 808
host: 127.0.0.2
вы должны использовать псевдоним в своем шаблоне. В примере выше вы должны использовать host1 в вашем шаблоне. Если вы используете IP-адрес, вы снова получите ошибку:
[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2
Расширенные параметры шаблонов
Общие шаблоны, описанные выше, удовлетворят большинство ваших потребностей, но Ansible предлагает несколько других способов определения хостов и групп, которые вы хотите нацелить.
Использование переменных в шаблонах
Вы можете использовать переменные для передачи спецификаторов групп через аргумент -e к ansible-playbook:
webservers:!{{ excluded }}:&{{ required }}
Использование позиции группы в шаблонах
Вы можете определить хост или подмножество хостов по его позиции в группе. Например, при следующей группе:
[webservers] cobweb webbing weber
вы можете использовать индексы для выбора отдельных хостов или диапазонов внутри группы webservers:
webservers[0] # == cobweb
webservers[-1] # == weber
webservers[0:2] # == webservers[0],webservers[1]
# == cobweb,webbing
webservers[1:] # == webbing,weber
webservers[:3] # == cobweb,webbing,weber
Использование регулярных выражений в шаблонах
Вы можете указать шаблон как регулярное выражение, начав шаблон с ~:
~(web|db).*\.example\.com
Шаблоны и флаги ansible-playbook
Вы можете изменить поведение шаблонов, определённых в playbooks, с помощью параметров командной строки. Например, вы можете запустить playbook, который определяет hosts: all на одном хосте, указав -i 127.0.0.2,. Это работает, даже если хост, на который вы нацеливаетесь, не определён в вашем инвентаре. Вы также можете ограничить хосты, на которые вы нацеливаетесь, в конкретном запуске, с флагом --limit:
ansible-playbook site.yml --limit datacenter2
Наконец, вы можете использовать --limit для чтения списка хостов из файла, добавив префикс к имени файла @:
ansible-playbook site.yml --limit @retry_hosts.txt
Чтобы применить ваши знания о шаблонах с командами и playbooks Ansible, прочитайте Введение в команды ad-hoc и О Playbooks.
См. также
- Введение в команды ad-hoc
- Примеры основных команд
- Работа с playbooks
- Изучение языка управления конфигурацией Ansible
- Список рассылки
- Вопросы? Помощь? Идеи? Обратитесь к списку на Google Groups
- irc.freenode.net
- #ansible IRC чат-канал
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.9/user_guide/intro_patterns.html