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)
说明
mapfilter将filter(regex_replace)应用于列表的各个元素;
regex_replace过滤器(带有以下正则表达式)将a prefix和添加suffix到字符串中;
current_list | map('regex_replace', '(.*)', 'prefix\\1suffix')
Run Code Online (Sandbox Code Playgroud)joinfilter在输出中将列表转换为逗号分隔的字符串。
另类
另一个可能的解决方案(基于您已经知道的方法)是使用Jinja2直接为目标字符串:
set_fact:
fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
Run Code Online (Sandbox Code Playgroud)
小智 5
您也可以使用三元过滤器:
set_fact:
fact2: "{% for it in fact1 %}https://{{ it }}:8000{{ loop.last | ternary('', ',') }}{% endfor %}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3551 次 |
| 最近记录: |