如何获取服务器名称列表并将资源 URI 和端口附加到每个服务器名称?
How can I take a list of server names and append a resource URI and port to each?
我合并了 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
filter 对列表的各个元素应用过滤器 (regex_replace
);
regex_replace
filter(使用以下正则表达式)将 prefix
和 suffix
添加到字符串;
current_list | map('regex_replace', '(.*)', 'prefix\1suffix')
join
filter 将列表转换为输出中以逗号分隔的字符串。
备选
另一种可能的解决方案(建立在您已知的基础之上)是使用 Jinja2 直接获取目标字符串:
set_fact:
fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
你也可以使用三元滤镜:
set_fact:
fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"
我合并了 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
filter 对列表的各个元素应用过滤器 (regex_replace
);regex_replace
filter(使用以下正则表达式)将prefix
和suffix
添加到字符串;current_list | map('regex_replace', '(.*)', 'prefix\1suffix')
join
filter 将列表转换为输出中以逗号分隔的字符串。
备选
另一种可能的解决方案(建立在您已知的基础之上)是使用 Jinja2 直接获取目标字符串:
set_fact:
fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
你也可以使用三元滤镜:
set_fact:
fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"