我有一个列表变量
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 }}"
]
}
}
怎样才能得到预期的结果?
我尝试替换引号,但得到相同的输出。
您的结果看起来像
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"
]
}
给定变量
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