首页 > 解决方案 > 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"   
     ]

实际剧本:

在此处输入图像描述

错误信息: 在此处输入图像描述

标签: listansibleconcatenation

解决方案


如果你这样写:

     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']"
}

推荐阅读