Одна из ключевых возможностей, которую предоставляет Ansible, это переменные. Они позволяют описывать конфигурационные параметры в одном месте и переиспользовать их многократно, что очень удобно.
- hosts: webservers
tasks:
- name: update nginx config
ansible.builtin.template:
src: templates/nginx.conf.j2
dest: /var/tmp/www/nginx.conf
- name: update index.html
ansible.builtin.copy:
src: files/index.html
dest: /var/tmp/www/index.html
В данном примере есть две задачи, где в путях для dest
используется одна и та же директория /var/tmp/www/. Мы можем избежать дублирования и описать ключ vars
, внутри которого перечислить названия переменных и их значения:
- hosts: webservers
vars:
root_dir: /var/tmp/www
tasks:
- name: update nginix config
ansible.builtin.template:
src: templates/nginx.conf.j2
dest: "{{root_dir}}/nginx.conf"
- name: update index.html
ansible.builtin.copy:
src: files/index.html
dest: "{{root_dir}}/index.html"
Ansible использует популярный питоновский шаблонизатор Jinja 2. Подстановка переменных в нем работает следующим образом. Перед тем, как разбирать YAML-файл, он прогоняет его через шаблонизатор, который заменяет конструкции {{название переменной}}
значениями этих переменных. Для переменной необходимо использовать кавычки, чтобы YAML распознавался корректно. Использование переменной без кавычек приведет к ошибке ERROR! Syntax Error while loading YAML.
:
- hosts: webservers
vars:
root_dir: /var/tmp/www
tasks:
- name: update nginix config
ansible.builtin.template:
src: templates/nginx.conf.j2
dest: {{root_dir}}/nginx.conf
Теперь разберем отличия между template
и copy
. Одна задача копирует nginx.conf, а вторая index.html. Но в случае с nginx.conf это не простое копирование. Это именно темплэйтинг. Он позволяет прогонять через Jinja 2 пользовательские файлы (не плэйбуки) и выполнять в них подстановки. Это значит, что переменные можно использовать не только в самом плэйбуке. Так удобно работать с конфигурационными файлами (но не только). Например, переменная root_dir
в файле nginx.conf.j2:
server {
location / {
root {{root_dir}};
}
}
будет заменена значением из секции vars
из плейбука:
server {
location / {
root /var/tmp/www;
}
}
Результат работы такого плейбука не изменится, но внутри произойдет подстановка нужного значения.
Из полезного: если мы случайно ошибемся в названии переменной, то Ansible нам подскажет, что была использована неопределенная переменная.
Самостоятельная работа
Создайте или используйте готовый плейбук, который устанавливает и настраивает Nginx
- Добавьте в плейбук следующие переменные
nginx_port
— порт Nginx по которому будет доступен серверroot_dir
— корневая директория Nginx, в которой будет файл index.html с любым содержимым
- Сконфигурируйте Nginx используя шаблон и переменные. По адресу http://SERVER_IP:
должна быть доступна веб-страница - Выполните плейбук Залейте изменения на Github
В результате выполнения задания получится плейбук с установкой и настройкой Nginx, конфигурируемый переменными.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.