17

我从 Ansible 清单中合并了两个列表:

set_fact:
  fact1: "{{ groups['group1'] + groups[group2']|list }}

输出是:

fact1:
  - server01
  - server02
  - server03

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

在这个例子中,我想要:https://server01:8000,https://server02:8000,https://server03:8000

我尝试使用连接:

set_fact:
  fact2: "{{ fact1|join(':8000,') }}"

这部分工作,但它留下了没有端口的最后一个服务器。

我怎样才能实现我的目标?

4

2 回答 2

29

解决方案

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

解释

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

  2. regex_replace过滤器(使用以下正则表达式)将一个prefix和添加suffix到一个字符串;

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


选择

另一种可能的解决方案(建立在您已经知道的基础上)是使用 Jinja2 直接获取目标字符串:

set_fact:
  fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
于 2017-11-01T04:07:55.160 回答
5

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

set_fact:
  fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"
于 2018-11-09T06:27:54.450 回答