如何构建一个模板文件,该文件可能因 Ansible 中的主机组而异?
How to structure a template file which might be different for groups of hosts in Ansible?
我有一个模板文件 iptables.j2
,其中包含一些核心规则(例如允许 SSH 连接)。然而,根据节点的角色,该模板将包含无法使用变量管理的附加规则。例如mongo 节点需要打开端口 27000,nginx 节点需要打开端口 80 和 443 等。
是否有条件包含额外内容到基本模板中的示例可以解决我的问题?
您可以检查 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 个文件,每个文件都不同。
让你的 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 %}
当然这取决于您的主机是否在适当的组中。
我有一个模板文件 iptables.j2
,其中包含一些核心规则(例如允许 SSH 连接)。然而,根据节点的角色,该模板将包含无法使用变量管理的附加规则。例如mongo 节点需要打开端口 27000,nginx 节点需要打开端口 80 和 443 等。
是否有条件包含额外内容到基本模板中的示例可以解决我的问题?
您可以检查 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 个文件,每个文件都不同。
让你的 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 %}
当然这取决于您的主机是否在适当的组中。