Переменные и шаблоны

AnsibleBeginner
Практиковаться сейчас

Введение

Если вы управляете 100 серверами, не нужно, чтобы они были полностью одинаковыми. Для каждого сервера могут потребоваться собственное имя узла, IP-адрес или определённые параметры конфигурации.

Ansible решает эту задачу с помощью переменных и шаблонов.

  • Переменные — это заполнители для данных, например port: 8080 или server_name: "web-01".
  • Шаблоны — это текстовые файлы с «пустыми местами». Ansible подставляет в них значения переменных и создаёт итоговый файл.

Именно это сочетание делает автоматизацию повторно используемой, а не однообразной. Вы можете хранить одну общую структуру для множества узлов, изменяя вставляемые данные для каждой среды или машины.

Ansible использует язык шаблонов Jinja2. Благодаря этому автоматизация становится более универсальной: один шаблон может создавать разные итоговые конфигурационные файлы в зависимости от переданных переменных.

В результате получится: Welcome to web-01

В этой лабораторной работе вы создадите для сервера пользовательскую HTML-страницу с помощью переменных и шаблонов.

Создайте шаблон

Сначала организуем файлы. Ansible ищет шаблоны в специальной папке с именем templates.

Это соглашение является частью философии проектирования Ansible. Предсказуемая структура каталогов упрощает чтение автоматизации и обмен ею между командами.

Создайте этот каталог внутри папки проекта:

mkdir -p ~/project/templates

Теперь создайте файл шаблона. Обычно имена файлов шаблонов заканчиваются на .j2 — это обозначение Jinja2.

Откройте nano, чтобы создать файл index.html.j2:

nano ~/project/templates/index.html.j2

Добавьте следующий HTML-код. Обратите внимание на специальные скобки {{ }}. Так Ansible получает указание «подставить сюда переменную».

<html>
  <head>
    <title>{{ page_title }}</title>
  </head>
  <body>
    <h1>Welcome to {{ inventory_hostname }}</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

Разберём переменные:

  • {{ page_title }} — это пользовательская переменная. Позже мы зададим её значение в плейбуке.
  • {{ inventory_hostname }} — это магическая переменная. Ansible знает её автоматически: это имя сервера, с которым он сейчас работает, в нашем случае localhost.

Важно различать эти два типа значений. Одни переменные задаёте вы, а другие Ansible предоставляет автоматически на основе inventory и контекста выполнения.

Сохраните файл и выйдите из редактора (Ctrl+X, Y, Enter).

Определите переменные

Теперь нужен плейбук, который будет использовать этот шаблон. В плейбуке мы зададим значение пользовательской переменной page_title.

Создайте новый файл с именем playbook.yml:

nano ~/project/playbook.yml

Сначала определите play и переменные:

---
- name: Deploy Web Page
  hosts: localhost
  vars:
    page_title: "My LabEx Web Server"
  tasks:

Разберём код:

  • vars: — раздел, в котором перечисляются переменные.
  • page_title: "..." — указание Ansible заменять {{ page_title }} в шаблоне на значение "My LabEx Web Server".

Оставьте файл открытым для следующего шага.

Используйте модуль template

Теперь добавим задачу, которая выполнит основную работу. Мы используем модуль template. Он читает файл .j2, подставляет значения переменных и сохраняет результат на сервере.

На практике модуль template используют для развёртывания многих конфигурационных файлов в реальных средах. Вместо копирования статического файла он создаёт версию с настройками конкретного узла на основе общего шаблона.

Добавьте задачу в файл playbook.yml. Внимательно следите за отступами!

---
- name: Deploy Web Page
  hosts: localhost
  become: yes
  vars:
    page_title: "My LabEx Web Server"
  tasks:
    - name: Create index.html from template
      template:
        src: templates/index.html.j2
        dest: /var/www/html/index.html
        mode: "0644"

Разберём код:

  • template: — используемый модуль.
  • src — исходный файл, то есть шаблон с заполнителями.
  • dest — путь назначения, куда должен быть помещён итоговый HTML-файл.
  • mode: "0644" — устанавливает права доступа, чтобы веб-сервер мог читать файл.
  • become: yes — этот параметр нужен, потому что для записи в /var/www/html требуются права root.

Сохраните файл и выйдите из редактора.

Разверните и проверьте результат

Запустим плейбук и посмотрим на результат.

Выполните плейбук:

ansible-playbook -i inventory playbook.yml

Если всё прошло успешно, вы увидите статус changed.

Теперь посмотрим на итоговый файл, созданный Ansible. Заполнителей в нём уже быть не должно: вместо них должны находиться реальные значения.

Выведите сгенерированный HTML-файл:

cat /var/www/html/index.html

Ожидаемый результат:

<html>
  <head>
    <title>My LabEx Web Server</title>
  </head>
  <body>
    <h1>Welcome to localhost</h1>
    <p>This file was generated by Ansible.</p>
  </body>
</html>

Как видите, {{ page_title }} превратилось в "My LabEx Web Server", а {{ inventory_hostname }} — в "localhost".

Итоги

В этой лабораторной работе вы научились делать конфигурации динамическими.

  1. Шаблоны — создали файл .j2 с заполнителями {{ placeholders }}.
  2. Переменные — определили значения в разделе vars плейбука.
  3. Магические переменные — использовали inventory_hostname, значение которой Ansible предоставляет автоматически.
  4. Модуль template — применили модуль template, чтобы объединить переменные и шаблон в итоговый конфигурационный файл.

Эта мощная возможность позволяет использовать один шаблон для настройки тысяч серверов, сохраняя для каждого из них собственные параметры.