问题描述
有一个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
变量,它是一个包含所有组和每个组所属主机列表的字典/映射。
然后,您可以使用模板过滤器来格式化列表:使用map
和regex_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
正文完