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 -%}