Как структурировать файл шаблона, который может отличаться для групп хостов в 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 файла, каждый из которых будет отличаться.

Другие вопросы по тегам