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

时间:2017-11-01 03:40:31

标签: ansible jinja2 ansible-template

我合并了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 个答案:

答案 0 :(得分:5)

<强>解决方案

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

<强>解释

  1. map filter将过滤器(regex_replace)应用于列表的各个元素;

  2. regex_replace filter(使用以下正则表达式)将prefixsuffix添加到字符串中;

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

  4. <强>替代

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

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

答案 1 :(得分:1)

还可以使用三元过滤器:

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