list - ANSIBLE - 如何将字符串与列表连接起来
问题描述
我正在尝试将作为变量引用的字符串与嵌套列表连接起来
我查看了使用 set_fact 和 join 的选项,但无济于事。
#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"
]
实际剧本:
解决方案
如果你这样写:
port: {{ env_dc }}{{item.ports}}
您不会生成通过将 in 的值与 in 中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']"
}
推荐阅读
- java - JAXB 文件在从 javafx 环境提供时覆盖旧文件。如何解决这个问题?
- php - If else 特定类别发布 wordpress
- c++ - STL 列出调用类的函数
- c++ - 关键字 - 内联 - 真的强制编译器在多个地方替换它吗?
- java - 使用 javax.mail 发送电子邮件:较新版本的库带来意外错误
- angular - 无法启动 Angular 项目 git 的问题
- php - WP All 导入选择图像 ID
- tensorflow - 安装期间的Tensorflow哈希错误(pip)
- python - re.sub 到 python 列表中的多个值,没有寄存器意义
- javascript - 使用 REST API 的下拉列表未显示(在控制台日志中显示)