Definition
Host patterns позволяют точно указывать на каких узлах требуется выполнить задачи
Паттерны с примером:
all
или*
— все хостыstage:dev
— объединение/логическое ИЛИstage:&dev
— пересечение/логическое Иstage:!dev
— исключение*.example
— wildcarddev[5:10]
— диапазон хостов (отсчет начинается с нуля)~web\d+\.example
— регулярные выражения
Вместо разделителя :
можно использовать ,
что предпочительнее при работе с IPv6 сетями или диапазонами
При этом порядок обработки следующий:
:
или,
&
!
Можно использовать комбинации паттернов:
hosts: dev:staging:&database:!queque
(все хосты из группdev
иstaging
если они также есть в группеdatabase
, но кроме хостов из группыqueque
)
Также можно использовать переменные для того, чтобы передавать группы через -e, --extra-vars
, например: hosts: webservers:!{{ excluded }}:&{{ required }}
Применять можно в плейбуках и ad-hoc командах, однако при использовании файла с плейбуком нужно использовать флаг -l, --limit
:
Примеры для ansible-playbook
и ansible
(не забывайте экранировать паттерны со специальными символами bash кавычками)
ansible-playbook -l hosts main.yml
ansible-playbook -l 'staging:&database' main.yml
ansible-playbook -l 'staging,&database' main.yml
ansible all:localhost -m setup
ansible all,localhost -m setup
ansible 'staging:&database' -m reboot
ansible 'staging,&database' -m reboot
Пример в плейбуке:
- name: Play this on all hosts except db group
hosts: all:!db
tasks:
- name: Change hostname
ansible.builtin.file:
use: systemd
name: "{{ inventory_hostname }}"
- name: Play this on all host that are also in a backup group but not in a web one
hosts: all:&backup:!web
tasks:
- name: Add host record to /etc/hosts
ansible.builtin.lineinfile:
path: /etc/hosts
line: "{{ ansible_host }} {{ inventory_hostname }}"
state: present
insertbefore: BOF