代码之家  ›  专栏  ›  技术社区  ›  Adam S

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

  •  18
  • Adam S  · 技术社区  · 7 年前

    我从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,') }}"
    

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

    2 回复  |  直到 7 年前
        1
  •  29
  •   techraf    7 年前

    解决方案

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

    解释

    1. map filter 应用筛选器( regex_replace )列表中的单个元素;

    2. regex_replace filter (使用以下正则表达式)添加 prefix suffix

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


    可供替代的

    另一种可能的解决方案(基于您已经知道的内容)是使用Jinja2直接为目标字符串:

    set_fact:
      fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"
    
        2
  •  5
  •   bav    6 年前

    也可以使用三值滤波器:

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