Как структурировать файл шаблона, который может отличаться для групп хостов в Ansible?
У меня есть файл шаблона iptables.j2
который содержит несколько основных правил (например, разрешить SSH-соединения). Однако в зависимости от роли узла этот шаблон будет содержать дополнительные правила, которыми нельзя управлять с помощью переменных. Например, узлам Монго нужно будет открыть порт 27000, а узлам nginx - порты 80 и 443 и т. д.
Есть ли примеры условного включения дополнительного контента в базовый шаблон, который может решить мою проблему?
2 ответа
Будет ли ваш файл iptables.j2 выглядеть примерно так?
# default SSH rules, etc.
{% if inventory_hostname in groups['nginx`] %}
# rules for nginx servers
{% endif %}
{% if inventory_hostname in groups['mongo'] %}
# rules for mongo servers
{% endif %}
Конечно, это будет зависеть от того, находятся ли ваши хосты в соответствующих группах.
Вы можете проверить, если inventory_hostname
в желаемом group
, Например:
playbook.yml
---
- hosts: all
gather_facts: no
tasks:
- name: Custom iptables
template: src=iptables.j2 dest="./table-{{ inventory_hostname }}"
delegate_to: 127.0.0.1
хостов
[all-hosts]
ansible ansible_ssh_host=192.168.42.2
webapp ansible_ssh_host=192.168.42.10
postgresql ansible_ssh_host=192.168.42.20
[ansible-host]
ansible
[webapp-hosts]
webapp
[postgresql-hosts]
postgresql
Тогда ваш шаблон будет выглядеть примерно так:
iptables.j2
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP
{% if inventory_hostname in groups['webapp-hosts'] %}
Open 443 port
{% endif %}
{% if inventory_hostname in groups['postgresql-hosts'] %}
Open 5432 port
{% endif %}
Если вы запустите вышеупомянутую программу воспроизведения, она сгенерирует 3 файла, каждый из которых будет отличаться.