Ответ
Шаблоны (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, обеспечивающий гибкость и согласованность.