如何获取服务器名称列表,并向每个服务器名称附加资源URI和端口?

Ada*_*m S 8 jinja2 ansible ansible-template

我合并了Ansible库存中的两个列表:

set_fact:
  fact1: "{{ groups['group1'] + groups[group2']|list }}
Run Code Online (Sandbox Code Playgroud)

输出为:

fact1:
  - server01
  - server02
  - server03
Run Code Online (Sandbox Code Playgroud)

有了以上结果,我需要在https://每个元素的前面加上一个端口号。然后,我需要将其转换为服务器配置的逗号分隔列表。

在此示例中,我想要:https://server01:8000,https://server02:8000,https://server03:8000

我尝试使用联接:

set_fact:
  fact2: "{{ fact1|join(':8000,') }}"
Run Code Online (Sandbox Code Playgroud)

可以部分工作,但最后一台服务器没有端口。

我如何实现我的目标?

tec*_*raf 10

set_fact:
  fact2: "{{ fact1 | map('regex_replace', '(.*)', 'https://\\1:8000') | join(',') }}"
Run Code Online (Sandbox Code Playgroud)

说明

  1. mapfilter将filter(regex_replace)应用于列表的各个元素;

  2. regex_replace过滤器(带有以下正则表达式)将a prefix和添加suffix到字符串中;

    current_list | map('regex_replace', '(.*)', 'prefix\\1suffix')
    
    Run Code Online (Sandbox Code Playgroud)
  3. joinfilter在输出中将列表转换为逗号分隔的字符串。


另类

另一个可能的解决方案(基于您已经知道的方法)是使用Jinja2直接为目标字符串:

set_fact:
  fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在某些 Python 版本上,“(.*)”将匹配整个字符串和末尾的空字符串,这意味着它将进行两次替换:https://docs.ansible.com/ansible/latest/user_guide/ playbooks_filters.html#正则表达式过滤器。我们应该使用 `^(.*)$` 来代替。 (6认同)

小智 5

您也可以使用三元过滤器:

set_fact:
  fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"
Run Code Online (Sandbox Code Playgroud)