Перейти к содержанию

Ansible templates

Документация по Ansible Templating

Шаблонизация

  • Параметризованные файлы конфигурации

  • Возмоность использования условий и переменных

  • Возможность переиспользования конфигурации

  • Описываются при помощи шаблонизатора Jinja2


Пример шаблона

Файл конфигурации templates/mongodb/mongod.conf.j2

# network interfaces
net:
 port: 27017
 bindIp: "{{ mongodb_listen_ip }}"
# Replication params
{% if mongodb_replication_replset %}


replication: 
 replSetName: "{{ mongodb_replication_replset }}"
{% endif %}
- name: Create mongod.conf file for MongoDB
 template:
  src: templates/mongodb/mongod.conf.j2
  dest: /etc/mongod.conf

Ветвление

Классическое ветвление может быть реализовано через {% if %},{% elif %},{% else %} и всегда закрывается через {% endif %}

postgres:
    {% if pr_replication_enabled == 1 %}
    pg_replication:
        user: "{{ pg_replication_user }}"
        host: "{{ pg_replication_host }}"
    {% else %}
    #replication is disabled
    {% endif %}
events {
    worker_connections 1024;
    multi_accept off;
}

{% if nginx_extra_conf_options %}
{{ nginx_extra_conf_options }}
{% endif %}

http {
ca {{ openvpn_dir }}/server/ca.crt
cert {{ openvpn_dir }}/server/server.crt
key {{ openvpn_dir }}/server/server.key
dh {{ openvpn_dir }}/server/dh.pem

{% if openvpn_tls_auth %}
tls_auth {{ openvpn_dir }}/ta.key
{% endif %}
tls-server
auth {{ openvpn_auth_alg | default('SHA256') }}
cipher {{ openvpn_cipher }}
{% if openvpn_tun_mtu %}
tun-mtu {{ openvpn_tun_mtu }}
{% endif %}
{% if openvpn_user_hardened_tls|bool %}
tls-version-min 1.2
{% endif %}

Циклы

Чтобы начать цикл со счетчиком, указываем {% for %}, а закрываем через {% endfor %}

{% if openvpn_custom_dns|bool %}
{% for srv in openvpn_dns_servers %}
push "dhcp-option DNS {{ srv }}"
{% endfor %}
{% else %}
push "dhcp-option DNS 1.0.0.1"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
{% endif %}
{% if 'pgbouncer' in group_names %}
# pgbouncer access
{% for item in groups['pgbouncer'] %}
host    all     all     {{ hostvars[item].ansible_default_ipv4.address }}/32    trust
{% endfor %}
{% endif %}

Индексация цикла

Элемент Описание
loop.index текущая итерация данного цикла (начиная с 1)
loop.index0 текущая итерация данного цикла (начиная с 0)
loop.revindex общее число итераций до окончания данного цикла (начиная с 1)
loop.revindex0 общее число итераций до окончания данного цикла (начиная с 0)
loop.first булево True если это первая итерация
loop.last булево True если это последняя итерация
loop.length общее число элементов в данной последовательности

Макросы

{% macro comma(loop) -%}
    {{ ',' if not loop.last else '' }}
{%- endmacro -%}

{% for dir in data_dirs if dir != "/" -%}
{% if loop.first -%}
data_dir = {{ dir }}{{comma(loop) }}
{% else %}
    {{ dir }}{{ comma(loop) }}
{% endif -% \}
{% else %}
# no data dirs found
{% endfor -%}