Ответ
В 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). Самое главное — один плейбук и один шаблон могут катить конфигурацию и на продакшн-сервер, и на тестовый стенд, и в дев-окружение. Просто задаёшь разные переменные для каждой группы хостов — и всё, хитрая жопа, работает как часы. Экономия времени — овердохуища!