Выбор хостов с использованием базовых шаблонов и шаблонов с подстановочными знаками
На этом этапе вы изучите основы нацеливания на конкретные хосты в вашей автоматизации Ansible. Основой этого является файл инвентаря Ansible, который перечисляет серверы, которыми вы управляете, и директива hosts в плейбуке, которая указывает, на каких из этих серверов должны выполняться задачи. Мы начнем с установки Ansible, создания базового инвентаря и плейбука, а затем рассмотрим, как выбирать хосты с использованием имен групп и шаблонов с подстановочными знаками.
Сначала убедитесь, что Ansible установлен в вашей среде. Ansible не установлен по умолчанию, поэтому вам нужно установить его с помощью менеджера пакетов DNF. Пакет ansible-core предоставляет основные инструменты командной строки Ansible, включая ansible-playbook. Выполните следующую команду:
sudo dnf install -y ansible-core
Вы должны увидеть вывод, похожий на этот:
...
Installed:
ansible-core-2.16.x-x.el9.x86_64
...
Complete!
Далее создадим выделенный каталог для этого упражнения, чтобы наши файлы были организованы. Все последующие действия на этом этапе будут выполняться в этом новом каталоге:
mkdir -p ~/project/ansible_patterns
cd ~/project/ansible_patterns
Теперь создайте файл инвентаря. Инвентарь — это текстовый файл, который определяет хосты и группы хостов, на которых работают команды, модули и задачи Ansible. Мы будем использовать формат INI из-за его простоты.
Используйте редактор nano для создания файла с именем inventory:
nano inventory
Добавьте следующее содержимое в файл inventory. Это определяет две группы, webservers и dbservers, каждая из которых содержит два хоста:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.lab.net
db2.lab.net
Сохраните файл и выйдите из nano, нажав Ctrl+X, затем Y и Enter.
Теперь, когда наш инвентарь готов, давайте создадим простой плейбук. Этот плейбук будет использовать модуль ansible.builtin.debug для вывода сообщения, подтверждающего, на каком хосте выполняется задача. Это отличный способ протестировать шаблоны хостов без внесения каких-либо фактических изменений в систему.
Создайте новый файл с именем playbook.yml:
nano playbook.yml
Добавьте следующее содержимое в формате YAML. Изначально он нацелен на все хосты в группе webservers:
---
- name: Test Host Patterns
hosts: webservers
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Сохраните и выйдите из редактора. Теперь запустите плейбук с помощью ansible-playbook. Флаг -i указывает наш пользовательский файл инвентаря:
ansible-playbook playbook.yml -i inventory
Вывод должен выглядеть примерно так:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
PLAY RECAP *********************************************************************
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Как вы можете видеть, были выбраны только хосты из группы webservers. Теперь давайте изменим плейбук, чтобы использовать подстановочный знак (*). Подстановочные знаки позволяют более гибко сопоставлять шаблоны.
Отредактируйте playbook.yml и измените строку hosts на hosts: "*.lab.net". Не забудьте заключить шаблоны, содержащие подстановочные знаки, в кавычки:
---
- name: Test Host Patterns
hosts: "*.lab.net"
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Запустите плейбук снова:
ansible-playbook playbook.yml -i inventory
Вы должны увидеть вывод, похожий на этот:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
На этот раз плей выполнился только на хостах, имена которых заканчиваются на .lab.net. Наконец, давайте используем специальное ключевое слово all, чтобы нацелиться на каждый хост, определенный в инвентаре.
Измените playbook.yml в последний раз и измените строку hosts на hosts: all:
---
- name: Test Host Patterns
hosts: all
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
Запустите плейбук, чтобы увидеть результат:
ansible-playbook playbook.yml -i inventory
Вывод покажет, что нацелены все хосты:
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Теперь плейбук выполняется на всех четырех хостах из вашего инвентаря, демонстрируя мощь шаблона all.