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

Ответ

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