我有一个模板文件iptables.j2
,其中包含一些核心规则(例如允许 SSH 连接)。但是,根据节点的角色,该模板将包含无法使用变量管理的其他规则。例如 mongo 节点将需要打开端口 27000 和 nginx 节点端口 80 和 443 等。
是否有条件将额外内容包含到可以解决我的问题的基本模板中的示例?
我有一个模板文件iptables.j2
,其中包含一些核心规则(例如允许 SSH 连接)。但是,根据节点的角色,该模板将包含无法使用变量管理的其他规则。例如 mongo 节点将需要打开端口 27000 和 nginx 节点端口 80 和 443 等。
是否有条件将额外内容包含到可以解决我的问题的基本模板中的示例?
让您的 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
。例如:
---
- 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 个文件,每个文件都不同。