Ответ
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 на целевой хост, подставляя все переменные.