Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible 如何获取服务器名称列表,并在每个名称后面附加资源URI和端口?_Ansible_Jinja2_Ansible Template - Fatal编程技术网

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

Ansible 如何获取服务器名称列表,并在每个名称后面附加资源URI和端口?,ansible,jinja2,ansible-template,Ansible,Jinja2,Ansible Template,我合并了Ansible库存中的两个列表: set_fact: fact1: "{{ groups['group1'] + groups[group2']|list }} 输出为: fact1: - server01 - server02 - server03 根据以上结果,我需要在每个元素的前面追加https://,在后面追加一个端口号。 然后,我需要将其转换为一个逗号分隔的服务器配置列表 在这个例子中,我想要:https://server01:8000,https://se

我合并了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(',') }}"
解释

set_fact:
  fact2: "{{ fact1 | map('regex_replace', '(.*)', 'https://\\1:8000') | join(',') }}"
  • 将筛选器(
    regex\u replace
    )应用于列表的各个元素

  • (使用以下正则表达式)向字符串添加
    前缀
    后缀

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


  • 备选方案

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

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

    也可以使用三元过滤器:

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

    请注意,在某些Python版本中,
    (.*)
    将匹配整个字符串和结尾的空字符串,这意味着它将进行两次替换:。我们应该改用
    ^(.*)$