如何构建一个模板文件,该文件可能因 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 %}

当然这取决于您的主机是否在适当的组中。