在映射中使用 var 和 regex_replace

问题描述 投票:0回答:2

我有一个列表变量

fqdn_list
。 它看起来像:

{
    "ansible_facts": {
        "fqdn_list": [
            "domain.example1.com",
            "    .    .    .    ",
            "domain.exampleN.com"
        ]
    }
}

我想为列表中的每个元素添加端口号。 为此,我尝试将

map
regex_replace
:

一起使用
- name: 'Creating url list'
  set_fact:
    url_list: "{{ fqdn_list | map('regex_replace', '$', ':{{ port }}') | list }}"
  vars:
    port: 8089

预期结果是:

{
    "ansible_facts": {
        "url_list": [
            "domain.example1.com:8089",
            "      .      .      .   ",
            "domain.exampleN.com:8089"
        ]
    }
}

但是执行后我看到:

{
    "ansible_facts": {
        "url_list": [
            "domain.example1.com:{{ port }}",
            "      .      .      .   ",
            "domain.exampleN.com:{{ port }}"
        ]
    }
}

怎样才能得到预期的结果?
我尝试替换引号,但得到相同的输出。

ansible
2个回答
4
投票

您的结果看起来像

domain.example1.com:{{ port }}
,因为您的
regex_replace
表达式附加了文字字符串
{{ port }}

回想一下,您从不嵌套

{{...}}
标记,并且您已经位于
{{...}}
模板上下文中。如果要替换变量的值,需要在引号的outside引用变量名(
"port"
是字符串,
port
是变量引用)。最简单的解决方案可能是使用 Python 风格的
%
字符串格式:

map('regex_replace', '$', ':%s' % port) |

这让你:

- name: 'Creating url list'
  set_fact:
    url_list: >-
      {{
        fqdn_list |
        map('regex_replace', '$', ':%s' % port) |
        list
      }}
  vars:
    port: 8089

请注意,为了提高可读性,我使用折叠引号运算符 (

>
) 重新格式化了您的任务,但在语法上,除了我对
map
参数所做的更改之外,它与您的原始任务相同。


运行以下示例剧本:

- hosts: localhost
  gather_facts: false
  vars:
    fqdn_list:
      - foo.com
      - bar.com
  tasks:
    - name: 'Creating url list'
      set_fact:
        url_list: >-
          {{
            fqdn_list |
            map('regex_replace', '$', ':%s' % port) |
            list
          }}
      vars:
        port: 8089

    - debug:
        var: url_list

debug
任务产生此输出:

TASK [debug] ********************************************************************************************
ok: [localhost] => {
    "url_list": [
        "foo.com:8089",
        "bar.com:8089"
    ]
}

1
投票

给定变量

  fqdn_list:
    - domain.example1.com
    - domain.example2.com
    - domain.example3.com
  service: 8089

创建产品加入项目

  url_list: "{{ fqdn_list | product([service]) | map('join', ':') }}"

给出了预期的结果

  url_list:
    - domain.example1.com:8089
    - domain.example2.com:8089
    - domain.example3.com:8089

用于测试的完整剧本示例

- hosts: all

  vars:
  
    fqdn_list:
      - domain.example1.com
      - domain.example2.com
      - domain.example3.com
    service: 8089
    
    url_list: "{{ fqdn_list | product([service]) | map('join', ':') }}"
    
  tasks:
  
    - debug:
        var: url_list
© www.soinside.com 2019 - 2024. All rights reserved.