我有一个模板文件iptables.j2
,其中包含一些核心规则(例如,允许SSH连接)。但是,根据节点的角色,该模板将包含无法使用变量管理的其他规则。例如mongo节点需要打开端口27000和nginx节点端口80& 443等..
是否有可以解决我的问题的基本模板中有条件包含额外内容的示例?
答案 0 :(得分:2)
您可以检查所需inventory_hostname
中的group
是否可变。
例如:
---
- 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
然后您的模板看起来与此类似:
-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个文件,每个文件都不同。
答案 1 :(得分: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 %}
当然,这取决于您的主机位于适当的组中。