Definition

Host patterns позволяют точно указывать на каких узлах требуется выполнить задачи

Паттерны с примером:

  • all или * — все хосты
  • stage:dev — объединение/логическое ИЛИ
  • stage:&dev — пересечение/логическое И
  • stage:!dev — исключение
  • *.example — wildcard
  • dev[5:10] — диапазон хостов (отсчет начинается с нуля)
  • ~web\d+\.example — регулярные выражения

Вместо разделителя : можно использовать , что предпочительнее при работе с IPv6 сетями или диапазонами

При этом порядок обработки следующий:

  1. : или ,
  2. &
  3. !

Можно использовать комбинации паттернов:

  • 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