Templates 基于组更改Ansible模板中的变量
我有一个类似这样的Ansible库存文件:Templates 基于组更改Ansible模板中的变量,templates,jinja2,ansible,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模板文件,如果主机属于“es masters”组,则需要将某个值设置为“true” 我相信有一个简单的方法可以做到这一点,但在谷歌搜索和阅读文档之后,我画了一个空白 我想在Jinja
[es-masters]
host1.my-network.com
[es-slaves]
host2.my-network.com
host3.my-network.com
[es:children]
es-masters
es-slaves
我还有一个Jinja2模板文件,如果主机属于“es masters”组,则需要将某个值设置为“true”
我相信有一个简单的方法可以做到这一点,但在谷歌搜索和阅读文档之后,我画了一个空白
我想在Jinja2模板中找到一些简单且编程的东西:
{% if hostvars[host][group] == "es-masters" %}
node_master=true
{% else %}
node_master=false
{% endif %}
有什么想法吗?你可以反过来做。 检查标识符(主机名或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/es-masters.yml
role_name_node_master: false
如果您的资源清册没有识别具有ansible_fqdn、ansible_主机名等的主机,您还可以使用
组名称
检查当前主机是否将“es masters”作为其组之一
{% if 'es-masters' in group_names %}
node_master=true
{% else %}
node_master=false
{% endif %}
请参见为避免不存在的组出错,您应首先检查该组是否存在:
{% if 'es-masters' in group_names and ansible_fqdn in groups['es-masters'] %}
node_master=true
{% else %}
node_master=false
{% endif %}
也许是这样?更改名为
node\u master
的变量,而不是使用txt您是将hostvars传递给渲染函数还是希望jinja2能够访问hostvars?这只是一个示例,真的-我真正想要的是一种编程方式来“查看”特定主机所属的组,并在此基础上找到更改模板中变量的方法。文档:除了直接在INI文件中存储变量外,主机和组变量还可以存储在相对于清单文件的单个文件中。这些变量文件采用YAML格式。如果您是YAML新手,请参阅YAML语法。YAML库包含在AppEngine SDKHow中,我是否将答案扩展到有孩子的小组,张贴在
{% if ansible_fqdn in groups['es-masters'] %}
{% set node_master=true %}
{% else %}
{% set node_master=false %}
{% endif %}