Цель урока: Изучить два фундаментальных механизма Ansible, которые позволяют создавать гибкие и переиспользуемые плейбуки: переменные для хранения данных и шаблоны Jinja2 для динамической генерации конфигурационных файлов.

Часть 1: Теория. Зачем нужны переменные?

Представьте наш плейбук из прошлого урока. Имя пакета nginx "зашито" прямо в коде.

- name: Убедиться, что пакет Nginx установлен
  apt:
    name: nginx
    state: present

Что, если мы хотим использовать этот же плейбук для установки Apache (apache2)? Нам придется копировать файл и менять nginx на apache2. А если таких мест в плейбуке десять? Это неудобно и чревато ошибками.

Переменные в Ansible решают эту проблему. Они позволяют вынести изменяемые данные (имена пакетов, пользователей, пути к файлам) из логики плейбука.

Как это работает:

  1. Вы объявляете переменную в специальном блоке vars.

  2. Вы используете эту переменную в задачах, обращаясь к ней через двойные фигурные скобки: {{ имя_переменной }}.

Часть 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:: Мы добавили новый блок на том же уровне, что и hostsbecometasks.

  • 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: Практика. Создаем сайт с помощью шаблона

Давайте создадим плейбук, который делает следующее:

  1. Устанавливает Nginx.

  2. Создает каталог для сайта.

  3. Генерирует для этого сайта index.html из шаблона.

  4. Генерирует конфигурационный файл Nginx для этого сайта из шаблона.

  5. Включает сайт и перезагружает 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: Запуск и проверка

  1. Добавьте в ваш локальный файл hostsВАШ_IP_АДРЕС ansible-test.local.

  2. Запустите плейбук:

    ansible-playbook setup_website.yml
  3. Откройте в браузере http://ansible-test.local. Вы должны увидеть сгенерированную страницу, на которой будет подставлено имя вашего сервера!

Часть 5: Заключение

Сегодня вы сделали гигантский скачок в возможностях автоматизации. Вы перестали просто выполнять команды и начали генерировать конфигурацию.

Вы научились:

  • Использовать переменные (vars) для того, чтобы сделать плейбуки гибкими.

  • Понимать, что такое шаблоны Jinja2 и как они работают.

  • Использовать модуль template для создания конфигурационных файлов "на лету" из шаблонов и переменных.

  • Использовать модуль file для создания каталогов и символических ссылок.

Теперь вы можете написать один плейбук, который будет разворачивать десятки разных сайтов, просто меняя переменные. Это и есть "Инфраструктура как Код" в действии.

На следующем, 60-м уроке, мы начнем знакомиться с еще одной революционной технологией - контейнеризацией и Docker. Мы узнаем, как запускать приложения в изолированных окружениях, что еще больше упрощает развертывание и управление.

Перейти к просмотру - УРОК №60.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи считают это полезным (0 голосов)