ANSIBLE-如何将字符串与列表连接

时间:2019-05-23 10:38:51

标签: list ansible concatenation

我正在尝试将一个被引用为带有嵌套列表的变量的字符串连接起来

我研究了使用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"   
     ]

实际剧本:

enter image description here

错误消息: enter image description here

1 个答案:

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