如何构建Ansible中主机组可能不同的模板文件?

时间:2015-07-10 18:32:59

标签: ansible ansible-template

我有一个模板文件iptables.j2,其中包含一些核心规则(例如,允许SSH连接)。但是,根据节点的角色,该模板将包含无法使用变量管理的其他规则。例如mongo节点需要打开端口27000和nginx节点端口80& 443等..

是否有可以解决我的问题的基本模板中有条件包含额外内容的示例?

2 个答案:

答案 0 :(得分:2)

您可以检查所需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个文件,每个文件都不同。

答案 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 %}

当然,这取决于您的主机位于适当的组中。