根据组更改Ansible模板中的变量

时间:2014-08-28 15:37:54

标签: templates jinja2 ansible

我有一个Ansible清单文件有点像这样:

[es-masters]
host1.my-network.com

[es-slaves]
host2.my-network.com
host3.my-network.com

[es:children]
es-masters
es-slaves

我还有一个Jinja2模板文件,需要将某个值设置为" true"如果主持人属于" es-masters"基。

我确信这是一种简单的方法,但经过一些谷歌搜索和阅读文档后,我已经画了一个空白。

我正在寻找像Jinja2模板这样简单且程序化的东西:

{% if hostvars[host][group] == "es-masters" %}
node_master=true
{% else %}
node_master=false
{% endif %}

有什么想法吗?

4 个答案:

答案 0 :(得分:14)

你反过来做。 您检查标识符(主机名或IP或库存中的任何内容)是否在定义的组中。如果该组属于hostvars,则不会。

{% if ansible_fqdn in groups['es-masters'] %}
node_master=true
{% else %}
node_master=false
{% endif %}

但是,你最好应该做的是:

在模板中提供默认值

# role_name/templates/template.j2
node_master={{ role_name_node_master | default(true) }}

在group_vars中覆盖

# group_vars/es-masters.yml
role_name_node_master: false

答案 1 :(得分:2)

如果您的库存无法识别带有ansible_fqdn,ansible_hostname等的主机,您还可以使用group_names检查当前主机是否具有“es-masters”作为其组之一。

{% if 'es-masters' in group_names %}
node_master=true
{% else %}
node_master=false
{% endif %}

http://docs.ansible.com/ansible/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts

答案 2 :(得分:0)

为了避免非现有组出错,您应首先检查该组是否存在:

{% if 'es-masters' in group_names and ansible_fqdn in groups['es-masters'] %}
node_master=true
{% else %}
node_master=false
{% endif %}

答案 3 :(得分:0)

{% if ansible_fqdn in groups['es-masters'] %}
    {% set node_master=true %}
{% else %}
    {% set node_master=false %}
{% endif %}

大概是这样?更改名为 node_master 的 var,而不是使用 txt