Что такое шаблон (Template) в Ansible?

Ответ

В Ansible шаблон (Template) — это файл на основе Jinja2, используемый для генерации динамических конфигурационных файлов на целевых хостах. Модуль template копирует такой файл, предварительно обработав все выражения и переменные Jinja2.

Ключевые особенности:

  • Файлы шаблонов обычно имеют расширение .j2.
  • Поддерживают полный синтаксис Jinja2: переменные, условия, циклы, фильтры и макросы.
  • Имеют доступ ко всем переменным Ansible: hostvars, group_vars, playbook-переменные и факты.

Пример шаблона Nginx конфигурации (templates/nginx.conf.j2):

server {
    listen {{ nginx_port | default(80) }};
    server_name {{ server_name }};
    root {{ web_root }};

    {% if enable_gzip %}
    gzip on;
    gzip_types text/plain application/json;
    {% endif %}
}

Использование в плейбуке:

- name: Deploy Nginx configuration
  ansible.builtin.template:
    src: nginx.conf.j2
    dest: /etc/nginx/sites-available/default
    owner: root
    group: root
    mode: '0644'
  notify: restart nginx

Практическое применение: Я использовал шаблоны для управления конфигурациями веб-серверов (Nginx/Apache), файлами сервисов systemd, настройками приложений и файлами переменных окружения, что позволяло разворачивать идентичные среды с разными параметрами (dev, staging, prod) из одного плейбука.

Ответ 18+ 🔞

Слушай, а шаблоны в Ansible — это вообще огонь, я тебе скажу. Представь себе: тебе нужно на десяток серверов раскидать конфиги, но на каждом нихуя не так — то порт другой, то имя сервиса. Писать под каждый свой файл? Да ну нахуй, это же пиздопроебибна работа. Вот тут-то и выручают шаблоны, или template, как их официально зовут.

Если по-простому, то это обычный текстовый файл, но с магией внутри. Он как чертёж, по которому Ansible на лету собирает итоговый файл, подставляя нужные значения. Расширение у них обычно .j2 — это типа намёк, что внутри Jinja2, а это такой движок шаблонов из Python, мощный дохуя.

В чём прикол, спросишь?

  • Внутри можно использовать все эти крутые штуки Jinja2: переменные, условия if, циклы for, фильтры (это чтобы данные преобразовать).
  • У шаблона есть доступ ко ВСЕМ переменным Ansible, которые у тебя есть: и факты о хосте, и переменные групп, и те, что в плейбуке объявил. Полный доступ, без ограничений!

Смотри, как это выглядит на практике. Допустим, конфиг для Nginx (templates/nginx.conf.j2):

server {
    listen {{ nginx_port | default(80) }};
    server_name {{ server_name }};
    root {{ web_root }};

    {% if enable_gzip %}
    gzip on;
    gzip_types text/plain application/json;
    {% endif %}
}

Видишь, {{ nginx_port }}? Это переменная. Если её не задали, то default(80) сработает — поставит порт 80. А {% if enable_gzip %} — это условие. Если в переменных enable_gzip стоит true, то строчки про gzip попадут в итоговый файл. Если false — то нихуя там не будет, чистое место. Удобно, ёпта!

А вот как это в плейбуке применить:

- name: Deploy Nginx configuration
  ansible.builtin.template:
    src: nginx.conf.j2
    dest: /etc/nginx/sites-available/default
    owner: root
    group: root
    mode: '0644'
  notify: restart nginx

Всё просто: берём шаблон (src), обрабатываем его с текущими переменными и кидаем готовый результат на хост в указанное место (dest). Права владельца и режим доступа тоже можно задать — красота!

Из личного опыта: я этими шаблонами чего только не делал, волнение ебать, как удобно. Конфиги для Apache и Nginx, конечно, в первую очередь. Файлы сервисов для systemd, чтобы службы правильно стартовали. Настройки для разных приложений и даже файлы окружения (.env). Самое главное — один плейбук и один шаблон могут катить конфигурацию и на продакшн-сервер, и на тестовый стенд, и в дев-окружение. Просто задаёшь разные переменные для каждой группы хостов — и всё, хитрая жопа, работает как часы. Экономия времени — овердохуища!