我正在尝试将一个被引用为带有嵌套列表的变量的字符串连接起来
我研究了使用set_fact并加入的选项,但无济于事。
#config.yml
- name: concatenate
module_name:Test
state: present
port: {{ env_dc }}{{item.ports}}
with_items:
- "{{ my_list }}"
#group_vars\all.yml
env_dc: uk
my_list:
- {name: switch1, ports: [p1, p2, p3, p4]}
我期望以下输出:
ukp1
ukp2
ukp3
ukp4
但是我得到了;
"item": {
"ports": [
"p1",
"p2",
"p3",
"p4"
]
实际剧本:
答案 0 :(得分:2)
如果您这样写:
port: {{ env_dc }}{{item.ports}}
您不会产生通过将env_dc
中的值与item.ports
中的每个项目连接而格式化的新列表;您只是在创建一个新字符串,其内容为env_dc
,后跟字符串表示形式item.ports
。也就是说,在您的示例中,结果将类似于:
uk['p1', 'p2', 'p3', 'p4']
您可以使用map
过滤器(可以将过滤器应用于列表中的所有项目)和regex_replace
过滤器来解决此问题,如下所示:
---
- hosts: localhost
gather_facts: false
vars:
env_dc: uk
my_list:
- name: switch1
ports:
- p1
- p2
- p3
- p4
tasks:
- debug:
msg: "ports: {{ item.ports|map('regex_replace', '^', env_dc)|list }}"
with_items: "{{ my_list }}"
根据您的示例数据得出的结果将为:
TASK [debug] **********************************************************************************
ok: [localhost] => (item={u'name': u'switch1', u'ports': [u'p1', u'p2', u'p3', u'p4']}) => {
"msg": "ports: [u'ukp1', u'ukp2', u'ukp3', u'ukp4']"
}