Пример настройки Ansible
Вы узнали о плейбуках, инвентаризации, ролях и переменных. В этом разделе все эти элементы объединены и описана примерная настройка для автоматизации веб-службы.
В примере настройки плейбуки, роли, инвентаризация и файлы с переменными сгруппированы по функциям. Теги на уровне плейбуков и задач обеспечивают более точную детализацию и управление. Это эффективный и гибкий подход, но есть и другие способы организации содержимого Ansible. Использование Ansible должно соответствовать вашим потребностям, поэтому вы можете изменить этот подход и организовать содержимое по своему усмотрению.
- Пример структуры каталогов
- Альтернативная структура каталогов
- Пример переменных групп и узлов
- Примеры плейбуков, сгруппированных по функциям
- Примеры файлов задач и обработчиков в роли, сгруппированной по функциям
- Возможности, которые обеспечивает пример настройки
- Организация для развертывания или настройки
- Использование локальных модулей Ansible
Пример структуры каталогов
В этой структуре большинство задач организовано в ролях, для каждой среды предусмотрен отдельный файл инвентаризации, а в каталоге верхнего уровня находится несколько плейбуков:
production # inventory file for production servers
staging # inventory file for staging environment
group_vars/
group1.yml # here we assign variables to particular groups
group2.yml
host_vars/
hostname1.yml # here we assign variables to particular systems
hostname2.yml
library/ # if any custom modules, put them here (optional)
module_utils/ # if any custom module_utils to support modules, put them here (optional)
filter_plugins/ # if any custom filter plugins, put them here (optional)
site.yml # main playbook
webservers.yml # playbook for webserver tier
dbservers.yml # playbook for dbserver tier
tasks/ # task files included from playbooks
webservers-extra.yml # <-- avoids confusing playbook with task files
roles/
common/ # this hierarchy represents a "role"
tasks/ #
main.yml # <-- tasks file can include smaller files if warranted
handlers/ #
main.yml # <-- handlers file
templates/ # <-- files for use with the template resource
ntp.conf.j2 # <------- templates end in .j2
files/ #
bar.txt # <-- files for use with the copy resource
foo.sh # <-- script files for use with the script resource
vars/ #
main.yml # <-- variables associated with this role
defaults/ #
main.yml # <-- default lower priority variables for this role
meta/ #
main.yml # <-- role dependencies and optional Galaxy info
library/ # roles can also include custom modules
module_utils/ # roles can also include custom module_utils
lookup_plugins/ # or other types of plugins, like lookup in this case
webtier/ # same kind of structure as "common" was above, done for the webtier role
monitoring/ # ""
fooapp/ # ""
Примечание
По умолчанию Ansible предполагает, что ваши плейбуки хранятся в одном каталоге, а роли — во вложенном каталоге с именем roles/. Если задач для автоматизации становится больше, можно перенести плейбуки во вложенный каталог с именем playbooks/. В этом случае необходимо задать путь к каталогу roles/ с помощью параметра roles_path в файле ansible.cfg.
Альтернативная структура каталогов
Также можно поместить каждый файл инвентаризации вместе с его group_vars/host_vars в отдельный каталог. Это особенно полезно, если group_vars/host_vars в разных средах имеют мало общего. Структура может выглядеть так, как показано в этом примере:
inventories/
production/
hosts # inventory file for production servers
group_vars/
group1.yml # here we assign variables to particular groups
group2.yml
host_vars/
hostname1.yml # here we assign variables to particular systems
hostname2.yml
staging/
hosts # inventory file for staging environment
group_vars/
group1.yml # here we assign variables to particular groups
group2.yml
host_vars/
stagehost1.yml # here we assign variables to particular systems
stagehost2.yml
library/
module_utils/
filter_plugins/
site.yml
webservers.yml
dbservers.yml
roles/
common/
webtier/
monitoring/
fooapp/
Такая структура обеспечивает большую гибкость в крупных средах, а также полное разделение переменных инвентаризации для разных сред. Однако этот подход сложнее в обслуживании, поскольку файлов становится больше. Дополнительную информацию об организации переменных групп и узлов см. в разделе Организация переменных узлов и групп.
Пример переменных групп и узлов
В этих примерах файлов групп и узлов содержатся переменные со значениями, применимыми к отдельным машинам или группам машин. Например, в центре обработки данных в Атланте используются собственные серверы NTP. Поэтому при настройке файла ntp.conf можно использовать код, подобный приведенному в этом примере:
--- # file: group_vars/atlanta ntp: ntp-atlanta.example.com backup: backup-atlanta.example.com
Аналогичным образом, для узлов группы веб-серверов нужна конфигурация, которая не применяется к серверам баз данных:
--- # file: group_vars/webservers apacheMaxRequestsPerChild: 3000 apacheMaxClients: 900
Значения по умолчанию или значения, которые верны во всех случаях, следует помещать в файл с именем group_vars/all:
--- # file: group_vars/all ntp: ntp-boston.example.com backup: backup-boston.example.com
При необходимости можно определить различия в конкретном оборудовании систем в каталоге host_vars:
--- # file: host_vars/db-bos-1.example.com foo_agent_port: 86 bar_agent_port: 99
Если вы используете динамическую инвентаризацию, Ansible автоматически создает множество динамических групп. Поэтому такой тег, как class:webserver, автоматически загрузит переменные из файла group_vars/ec2_tag_class_webserver.
Примечание
Доступ к переменным узла можно получить с помощью специальной переменной hostvars. Список таких переменных см. в разделе Специальные переменные. Переменная hostvars позволяет получить доступ только к переменным конкретного узла, но не к переменным группы.
Примеры плейбуков, сгруппированных по функциям
При такой настройке один плейбук может описывать всю инфраструктуру. Плейбук site.yml импортирует два других плейбука: один для веб-серверов, другой — для серверов баз данных:
--- # file: site.yml - import_playbook: webservers.yml - import_playbook: dbservers.yml
Плейбук webservers.yml, который также находится на верхнем уровне, связывает конфигурацию группы веб-серверов с ролями, относящимися к этой группе:
---
# file: webservers.yml
- hosts: webservers
roles:
- common
- webtier
При такой настройке можно настроить всю инфраструктуру, выполнив site.yml. Чтобы настроить только часть инфраструктуры, выполните webservers.yml. Это похоже на параметр Ansible --limit, но задается немного более явно:
ansible-playbook site.yml --limit webservers ansible-playbook webservers.yml
Примеры файлов задач и обработчиков в роли, сгруппированной по функциям
Ansible загружает любой файл с именем main.yml из вложенного каталога роли. В этом примере файл tasks/main.yml настраивает NTP:
---
# file: roles/common/tasks/main.yml
- name: be sure ntp is installed
yum:
name: ntp
state: present
tags: ntp
- name: be sure ntp is configured
template:
src: ntp.conf.j2
dest: /etc/ntp.conf
notify:
- restart ntpd
tags: ntp
- name: be sure ntpd is running and enabled
ansible.builtin.service:
name: ntpd
state: started
enabled: true
tags: ntp
Ниже приведен пример файла обработчиков. Обработчики запускаются только в том случае, если некоторые задачи сообщают об изменениях. Обработчики выполняются в конце каждого плейбука:
---
# file: roles/common/handlers/main.yml
- name: restart ntpd
ansible.builtin.service:
name: ntpd
state: restarted
Дополнительную информацию см. в разделе Роли.
Возможности, которые обеспечивает пример настройки
Описанная выше базовая организационная структура позволяет использовать множество вариантов автоматизации. Чтобы перенастроить всю инфраструктуру:
ansible-playbook -i production site.yml
Чтобы перенастроить NTP на всех системах:
ansible-playbook -i production site.yml --tags ntp
Чтобы перенастроить только веб-серверы:
ansible-playbook -i production webservers.yml
Чтобы перенастроить только веб-серверы в Бостоне:
ansible-playbook -i production webservers.yml --limit boston
Чтобы перенастроить только первые 10 веб-серверов в Бостоне, а затем следующие 10:
ansible-playbook -i production webservers.yml --limit boston[0:9] ansible-playbook -i production webservers.yml --limit boston[10:19]
Пример настройки также поддерживает базовые разовые команды:
ansible boston -i production -m ping ansible boston -i production -m command -a '/sbin/reboot'
Чтобы узнать, какие задачи будут выполнены и какие имена узлов будут затронуты определенной командой Ansible:
# confirm what task names would be run if I ran this command and said "just ntp tasks" ansible-playbook -i production webservers.yml --tags ntp --list-tasks # confirm what hostnames might be communicated with if I said "limit to boston" ansible-playbook -i production webservers.yml --limit boston --list-hosts
Организация для развертывания или настройки
Пример настройки иллюстрирует типичную топологию конфигурации. При многоуровневом развертывании приложения, скорее всего, понадобятся дополнительные плейбуки, которые будут переходить между уровнями для развертывания приложения. В этом случае можно дополнить site.yml такими плейбуками, как deploy_exampledotcom.yml. Однако общие принципы остаются прежними. С помощью Ansible можно выполнять развертывание и настройку одной и той же утилитой. Поэтому, вероятно, вы будете повторно использовать группы и хранить конфигурацию ОС в отдельных плейбуках или ролях, отличных от тех, что используются для развертывания приложения.
Воспринимайте «плейбуки» как спортивную метафору: у вас может быть набор игровых комбинаций для всей инфраструктуры. Кроме того, есть ситуационные комбинации, которые применяются в разное время и для разных целей.
Использование локальных модулей Ansible
Если рядом с YAML-файлом плейбука находится каталог ./library, в нем можно разместить модули Ansible, которые автоматически добавятся в путь поиска модулей. Так модули будут организованы вместе с плейбуками. Например, см. структуру каталогов в начале этого раздела.
См. также
- Синтаксис YAML
-
Узнайте о синтаксисе YAML
- Работа с плейбуками
-
Ознакомьтесь с основными возможностями плейбуков
- Указатель коллекций
-
Просмотрите существующие коллекции, модули и плагины
- Стоит ли разрабатывать модуль?
-
Узнайте, как расширить 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/tips_tricks/sample_setup.html