
Цель урока: Изучить два фундаментальных механизма Ansible, которые позволяют создавать гибкие и переиспользуемые плейбуки: переменные для хранения данных и шаблоны Jinja2 для динамической генерации конфигурационных файлов.
Часть 1: Теория. Зачем нужны переменные?
Представьте наш плейбук из прошлого урока. Имя пакета nginx "зашито" прямо в коде.
- name: Убедиться, что пакет Nginx установлен
apt:
name: nginx
state: present
Что, если мы хотим использовать этот же плейбук для установки Apache (apache2)? Нам придется копировать файл и менять nginx на apache2. А если таких мест в плейбуке десять? Это неудобно и чревато ошибками.
Переменные в Ansible решают эту проблему. Они позволяют вынести изменяемые данные (имена пакетов, пользователей, пути к файлам) из логики плейбука.
Как это работает:
-
Вы объявляете переменную в специальном блоке vars.
-
Вы используете эту переменную в задачах, обращаясь к ней через двойные фигурные скобки: {{ имя_переменной }}.
Часть 2: Практика. Используем переменные в плейбуке
Давайте перепишем наш плейбук install_nginx.yml, используя переменные.
Шаг 1: Открываем файл плейбука
cd ~/ansible_projects
nano install_nginx.yml
Шаг 2: Добавляем блок vars и заменяем "зашитые" значения
Полностью замените содержимое файла на этот код:
---
- name: Play 1 - Настройка веб-сервера
hosts: webservers
become: true
vars:
package_name: nginx
service_name: nginx
tasks:
- name: Task 1 - Обновить кэш apt (только если устарел)
apt:
update_cache: yes
cache_valid_time: 3600
- name: Task 2 - Убедиться, что пакет {{ package_name }} установлен
apt:
name: "{{ package_name }}"
state: present
- name: Task 3 - Убедиться, что служба {{ service_name }} запущена и в автозагрузке
service:
name: "{{ service_name }}"
state: started
enabled: yes
Разбор изменений:
-
vars:: Мы добавили новый блок на том же уровне, что и hosts, become, tasks.
-
package_name: nginx: Мы объявили переменную package_name и присвоили ей значение nginx.
-
name: "{{ package_name }}": Теперь в модуле apt мы используем не статичное слово nginx, а нашу переменную. Ansible перед выполнением задачи подставит вместо {{ package_name }} ее значение.
-
Мы также сделали это для имени службы, так как оно совпадает с именем пакета.
Шаг 3: Запуск и проверка
Сохраните и запустите плейбук:
ansible-playbook install_nginx.yml
Результат будет абсолютно таким же, как и в прошлом уроке. Но теперь, если вы захотите установить Apache, вам достаточно изменить всего две строки в блоке vars, и весь плейбук адаптируется!
Часть 3: Теория. Что такое шаблоны Jinja2?
Переменные - это хорошо. Но что, если нам нужно не просто подставить слово, а сгенерировать целый конфигурационный файл, который будет отличаться для разных серверов?
Для этого Ansible использует мощный шаблонизатор Jinja2.
Шаблон - это текстовый файл (например, nginx.conf.j2), который выглядит как обычный конфигурационный файл, но с "дырками" - специальными конструкциями, куда Ansible подставит значения переменных.
Основные конструкции Jinja2:
-
{{ имя_переменной }}: Простая подстановка значения переменной.
-
{% if условие %} ... {% endif %}: Условные блоки.
-
{% for элемент in список %} ... {% endfor %}: Циклы для перебора списков.
Часть 4: Практика. Создаем сайт с помощью шаблона
Давайте создадим плейбук, который делает следующее:
-
Устанавливает Nginx.
-
Создает каталог для сайта.
-
Генерирует для этого сайта index.html из шаблона.
-
Генерирует конфигурационный файл Nginx для этого сайта из шаблона.
-
Включает сайт и перезагружает Nginx.
Шаг 1: Создаем структуру проекта
cd ~/ansible_projects
# Создадим каталог для шаблонов
mkdir templates
# Создадим плейбук
nano setup_website.yml
Шаг 2: Создаем шаблон для index.html
nano templates/index.html.j2
Вставьте в него следующий код:
<!DOCTYPE html>
<html>
<head>
<title>{{ site_title }}</title>
<meta charset="UTF-8">
</head>
<body>
<h1>Добро пожаловать на сайт {{ domain_name }}!</h1>
<p>Этот сайт был автоматически развернут с помощью Ansible.</p>
<p>Он работает на сервере с именем хоста: {{ ansible_hostname }}.</p>
</body>
</html>
-
{{ site_title }}, {{ domain_name }}: Это наши собственные переменные, которые мы определим в плейбуке.
-
{{ ansible_hostname }}: Это факт Ansible. Ansible автоматически собирает сотни таких фактов о системе, и мы можем использовать их в шаблонах!
Шаг 3: Создаем шаблон для конфига Nginx
# nano templates/nginx.conf.j2
Вставьте в него код, который мы писали для виртуального хоста:
server {
listen 80;
server_name {{ domain_name }} www.{{ domain_name }};
root /var/www/{{ domain_name }}/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Здесь мы используем переменную {{ domain_name }} для имени сервера и пути к файлам.
Шаг 4: Пишем плейбук setup_website.yml
---
- name: Развернуть статический сайт на Nginx
hosts: webservers
become: true
vars:
domain_name: ansible-test.local
site_title: "Тестовый сайт Ansible"
tasks:
- name: Убедиться, что Nginx установлен
apt:
name: nginx
state: present
- name: Создать корневой каталог для сайта
file:
path: "/var/www/{{ domain_name }}/html"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Сгенерировать index.html из шаблона
template:
src: templates/index.html.j2
dest: "/var/www/{{ domain_name }}/html/index.html"
- name: Сгенерировать конфиг Nginx из шаблона
template:
src: templates/nginx.conf.j2
dest: "/etc/nginx/sites-available/{{ domain_name }}"
- name: Включить сайт (создать симлинк)
file:
src: "/etc/nginx/sites-available/{{ domain_name }}"
dest: "/etc/nginx/sites-enabled/{{ domain_name }}"
state: link
- name: Перезагрузить Nginx
service:
name: nginx
state: reloaded
Разбор новых модулей:
-
file:: Очень мощный модуль для работы с файлами и каталогами.
-
state: directory: Убедиться, что по этому пути существует каталог.
-
state: link: Убедиться, что по этому пути существует символическая ссылка.
-
-
template:: Сердце этого урока.
-
src: Путь к нашему .j2 файлу шаблона.
-
dest: Путь, куда нужно сохранить сгенерированный файл.
-
Шаг 5: Запуск и проверка
-
Добавьте в ваш локальный файл hosts: ВАШ_IP_АДРЕС ansible-test.local.
-
Запустите плейбук:
ansible-playbook setup_website.yml -
Откройте в браузере http://ansible-test.local. Вы должны увидеть сгенерированную страницу, на которой будет подставлено имя вашего сервера!
Часть 5: Заключение
Сегодня вы сделали гигантский скачок в возможностях автоматизации. Вы перестали просто выполнять команды и начали генерировать конфигурацию.
Вы научились:
-
Использовать переменные (vars) для того, чтобы сделать плейбуки гибкими.
-
Понимать, что такое шаблоны Jinja2 и как они работают.
-
Использовать модуль template для создания конфигурационных файлов "на лету" из шаблонов и переменных.
-
Использовать модуль file для создания каталогов и символических ссылок.
Теперь вы можете написать один плейбук, который будет разворачивать десятки разных сайтов, просто меняя переменные. Это и есть "Инфраструктура как Код" в действии.
На следующем, 60-м уроке, мы начнем знакомиться с еще одной революционной технологией - контейнеризацией и Docker. Мы узнаем, как запускать приложения в изолированных окружениях, что еще больше упрощает развертывание и управление.
Перейти к просмотру - УРОК №60.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com

