il-fox
il-fox

Reputation: 75

ANSIBLE - how to concatenate a string with a list

I am trying to concatenate a string which is referenced as variable with a nested list

I looked into the options of using the set_fact and join but to no avail.

#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]}

I am expecting the following output:
ukp1
ukp2
ukp3
ukp4

But I am getting;

"item": {    
    "ports": [     
       "p1",    
       "p2",    
       "p3",    
       "p4"   
     ]

Actual Playbook:

enter image description here

Error message: enter image description here

Upvotes: 0

Views: 4651

Answers (1)

larsks
larsks

Reputation: 311606

If you write this:

     port: {{ env_dc }}{{item.ports}}

You are not producing a new list formated by concatenating the value in env_dc with each item in item.ports; you are simply creating a new string that has the contents of env_dc followed by the string representation of item.ports. That is, in your example, that would evaluate to something like:

uk['p1', 'p2', 'p3', 'p4']

You can solve this using the map filter (which can apply a filter to all items in a list) and the regex_replace filter, like this:

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

Which given your example data would evaluate to:

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

Upvotes: 3

Related Questions