>我合并了 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,') }}"
这部分有效,但它使最后一个服务器没有端口。
我怎样才能实现我的目标?
解决方案
set_fact:
fact2: "{{ fact1 | map('regex_replace', '(.*)', 'https://\1:8000') | join(',') }}"
解释
map
过滤器将过滤器(regex_replace
)应用于列表的各个元素;regex_replace
筛选器(使用以下正则表达式)向字符串添加prefix
和suffix
;current_list | map('regex_replace', '(.*)', 'prefix\1suffix')
筛选器
join
将列表转换为输出中的逗号分隔字符串。
另类
另一种可能的解决方案(建立在您已经知道的基础上)是使用 Jinja2 直接用于目标字符串:
set_fact:
fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
您也可以使用三元过滤器:
set_fact:
fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"
我有这个库存列表,我想这样做["服务器"]服务器01服务器02服务器03服务器04在这个例子中,我想要: