Ответ
Шаблоны (Templates) в Ansible — это файлы (обычно с расширением .j2), которые используют движок шаблонов Jinja2 для динамической генерации конфигурационных файлов на управляемых хостах. Модуль template копирует такой файл, рендерит переменные и условия, а затем размещает результат в целевой директории.
Зачем это нужно в DevOps? Для реализации принципа Infrastructure as Code (IaC), когда одна конфигурация (шаблон) адаптируется под разные среды (dev, staging, prod) или серверы через переменные.
Пример шаблона конфигурации веб-сервера (nginx.conf.j2):
# nginx.conf.j2
server {
listen {{ nginx_port | default(80) }};
server_name {{ server_name }};
root {{ web_root }};
{% if enable_ssl %}
listen 443 ssl;
ssl_certificate {{ ssl_cert_path }};
ssl_certificate_key {{ ssl_key_path }};
{% endif %}
location / {
proxy_pass http://{{ app_backend_host }}:{{ app_backend_port }};
{% if enable_logging %}
access_log /var/log/nginx/access.log;
{% endif %}
}
}
Использование в плейбуке:
- name: Deploy Nginx configuration from template
ansible.builtin.template:
src: "templates/nginx.conf.j2"
dest: "/etc/nginx/sites-available/{{ server_name }}"
owner: root
group: root
mode: '0644'
vars:
nginx_port: 8080
server_name: "myapp.example.com"
web_root: "/var/www/html"
enable_ssl: true
ssl_cert_path: "/etc/ssl/certs/myapp.crt"
app_backend_host: "localhost"
app_backend_port: 3000
notify: Reload nginx
Возможности Jinja2 в шаблонах:
- Переменные:
{{ variable_name }} - Условия:
{% if condition %} ... {% endif %} - Циклы:
{% for item in list %} ... {% endfor %} - Фильтры:
{{ variable | upper }},{{ list | join(',') }} - Макросы и включения для повторного использования кода.
Использование шаблонов — это стандартный способ управления конфигурациями сервисов (Nginx, Docker, systemd, приложений) в Ansible, обеспечивающий гибкость и согласованность.
Ответ 18+ 🔞
Слушай, ну это ж классика, ебать мои старые костыли! Шаблоны в Ansible — это, по сути, такие файлики с расширением .j2. Внутри них сидит движок Jinja2, который как хитрая жопа, умеет подставлять переменные и выполнять условия, чтобы на выходе получить готовый конфиг для сервера. Модуль template берёт этот файл, рендерит всё нахуй, и кидает результат куда скажешь.
А нахуя это в DevOps? Да чтобы реализовать этот ваш принцип Infrastructure as Code (IaC), ёпта! Один шаблон, а под разные среды (dev, staging, prod) или серверы он адаптируется через переменные. Удобно же, блядь.
Вот смотри, пример шаблона для веб-сервера (nginx.conf.j2):
# nginx.conf.j2
server {
listen {{ nginx_port | default(80) }};
server_name {{ server_name }};
root {{ web_root }};
{% if enable_ssl %}
listen 443 ssl;
ssl_certificate {{ ssl_cert_path }};
ssl_certificate_key {{ ssl_key_path }};
{% endif %}
location / {
proxy_pass http://{{ app_backend_host }}:{{ app_backend_port }};
{% if enable_logging %}
access_log /var/log/nginx/access.log;
{% endif %}
}
}
А вот как это в плейбуке применить:
- name: Deploy Nginx configuration from template
ansible.builtin.template:
src: "templates/nginx.conf.j2"
dest: "/etc/nginx/sites-available/{{ server_name }}"
owner: root
group: root
mode: '0644'
vars:
nginx_port: 8080
server_name: "myapp.example.com"
web_root: "/var/www/html"
enable_ssl: true
ssl_cert_path: "/etc/ssl/certs/myapp.crt"
app_backend_host: "localhost"
app_backend_port: 3000
notify: Reload nginx
Что Jinja2 умеет, ёклмн:
- Переменные:
{{ variable_name }}— подставит что надо. - Условия:
{% if condition %} ... {% endif %}— сделает только если нужно. - Циклы:
{% for item in list %} ... {% endfor %}— чтобы не повторяться, как мартышлюшка. - Фильтры:
{{ variable | upper }},{{ list | join(',') }}— чтобы форматировать. - Макросы и включения — для повторного использования кода, а то пиздопроебибна какая-то получится.
Использование шаблонов — это стандартный и охуенный способ управлять конфигурациями всяких Nginx, Docker, systemd и прочего. Обеспечивает и гибкость, и чтобы всё было одинаково, а не как попало.