Какой язык шаблонов используется в Ansible?

«Какой язык шаблонов используется в Ansible?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ansible для создания динамических конфигурационных файлов использует шаблонизатор Jinja2, который является стандартным для экосистемы Python.

Пример из практики – шаблон конфига Nginx с условиями и циклами:

# templates/nginx.conf.j2
server {
    listen {{ nginx_port }};
    server_name {{ server_name }};
    root {{ web_root }};

    {% if enable_gzip %} # Условное включение модуля
    gzip on;
    gzip_types text/plain application/json;
    {% endif %}

    {% for location in nginx_locations %} # Цикл по списку location-ов
    location {{ location.path }} {
        proxy_pass http://{{ location.backend }};
        {% if location.extra_params %}
        {{ location.extra_params }}
        {% endif %}
    }
    {% endfor %}

    # Использование фильтров
    access_log /var/log/nginx/access.log combined buffer={{ log_buffer_size | default('32k') }};
}

Ключевые возможности Jinja2 в Ansible:

  • Переменные: {{ variable }}.
  • Условия: {% if ... %} ... {% elif ... %} ... {% endif %}.
  • Циклы: {% for item in list %} ... {% endfor %}.
  • Фильтры: Мощные преобразования данных (например, {{ list | join(',') }}, {{ path | basename }}, {{ secret | hash('sha256') }}).
  • Макросы (macros): Для создания переиспользуемых блоков кода в шаблонах.
  • Доступ к фактам Ansible: В шаблонах доступны все gathered facts ({{ ansible_facts['distribution'] }}) и переменные из playbook, inventory и set_fact.

Шаблоны обрабатываются модулем template, который копирует файл .j2 на целевой хост, подставляя все переменные.