在Jinja2模板中如何从Ansible `hosts`文件的特定部分获取主机

95次阅读
没有评论

问题描述

有一个hosts文件,其中包含以下内容:

[elasticsearch_nodes]
host1 os=linux
host2 os=linux
host3 os=linux

在一个.j2模板中,用户想要获取[elasticsearch_nodes]的主机列表。
用户还提供了以下代码片段,用于在列表中添加引号和逗号。

{% for host in some_sort_of_ansible_magic_to_get_me_that_list_i_need %}
  "{{ host }}"{% if not loop.last %},{% endif %}
{% endfor %}

用户想知道如何实现这个功能。

解决方案

请注意以下操作注意版本差异及修改前做好备份。
您需要使用Ansible的魔术变量,特别是groups变量,它是一个包含所有组和每个组所属主机列表的字典/映射。
然后,您可以使用模板过滤器来格式化列表:使用mapregex_replace将引号添加到所有列表元素,然后使用join将它们连接成最终结果。
以下是实现这个功能的步骤:
1. 在您的Jinja2模板中,使用以下代码获取[elasticsearch_nodes]的主机列表:

{{ groups['elasticsearch_nodes']|map('regex_replace', '(.*)', '"\\1"')|join(',') }}

在上面的代码中,我们使用groups['elasticsearch_nodes']获取[elasticsearch_nodes]组的主机列表。然后,我们使用map过滤器和regex_replace函数将引号添加到每个列表元素。最后,我们使用join过滤器将列表元素连接成一个字符串,使用逗号分隔。
请注意,上述代码假设您的hosts文件已正确配置,并且[elasticsearch_nodes]组中的主机列表是有效的。

示例

以下是一个示例hosts文件:

[elasticsearch_nodes]
host1 os=linux
host2 os=linux
host3 os=linux

使用上述解决方案,您可以在Jinja2模板中使用以下代码获取[elasticsearch_nodes]的主机列表:

{{ groups['elasticsearch_nodes']|map('regex_replace', '(.*)', '"\\1"')|join(',') }}

这将输出以下结果:

"host1","host2","host3"

请注意,上述代码中的引号是为了在输出中添加引号,并不是必需的。如果您不需要引号,可以将代码修改为:

{{ groups['elasticsearch_nodes']|join(',') }}

这将输出以下结果:

host1,host2,host3

正文完