1

I looking to replace item value to storage name storageA. 1.File vvsets.yml.

vvsets: [{'key': 'lun.101', 'value': ['server001']}, {'key': 'lun.101', 'value': ['server001']}, {'key': 'lun.201', 'value': ['server002']}, {'key': 'lun.301', 'value': ['server003']}]

2.File main.yml.

    tasks:
      - name: A
          include_vars: vvsets.yml
    
      - set_fact:
          vvsets: "{{ vvsets | combine(new_item, recursive=true) }}"
        vars:
          new_item: { 'value': 'storageA' }
        loop: "{{ vvsets }}"
  1. Output.
 TASK [set_fact] 
    ok: [localhost] => (item={'key': 'lun.101', 'value': ['server001']}) => {
        "ansible_facts": {
            "vvsets": {
                "key": "lun.301",
                "value": "storageA"
            }
        },
        "ansible_loop_var": "item",
        "changed": false,
        "item": {
            "key": "lun.101",
            "value": [
                "server001"
            ]
        }
    }
    ok: [localhost] => (item={'key': 'lun.101', 'value': ['server001']}) => {
        "ansible_facts": {
            "vvsets": {
                "key": "lun.301",
                "value": "storageA"
            }
        },
        "ansible_loop_var": "item",
        "changed": false,
        "item": {
            "key": "lun.101",
            "value": [
                "server001"
            ]
        }
    }
    ok: [localhost] => (item={'key': 'lun.201', 'value': ['server002']}) => {
        "ansible_facts": {
            "vvsets": {
                "key": "lun.301",
                "value": "storageA"
            }
        },
        "ansible_loop_var": "item",
        "changed": false,
        "item": {
            "key": "lun.201",
            "value": [
                "server002"
            ]
        }
    }
    ok: [localhost] => (item={'key': 'lun.301', 'value': ['server003']}) => {
        "ansible_facts": {
            "vvsets": {
                "key": "lun.301",
                "value": "storageA"
            }
        },
        "ansible_loop_var": "item",
        "changed": false,
        "item": {
            "key": "lun.301",
            "value": [
                "server003"
            ]
        }
    }
  1. Based on the output, only last is change. Look like first 3 is bypassed.Below is expected new list.
vvsets:
- 'key': 'lun.101' 
  'value': ['storageA']
- 'key': 'lun.101' 
  'value': ['storageA']
- 'key': 'lun.201'
  'value': ['storageA'] 
- 'key': 'lun.301'
  'value': ['storageA']

1 Answer 1

2

The Problem in your playbook is:

vvsets: "{{ vvsets | combine(new_item, recursive=true) }}"

This will return only the last element modified.

Below Playbook will do the job for you.

---
  - name: "Playing with Ansible and Git"
    hosts: localhost
    connection: local
    tasks:
      - name: A
        include_vars: vvsets.yml

      - set_fact:
          vvsets_new: []

      - set_fact:
          vvsets_new: "{{ vvsets_new + [new_value] }}"
        vars:
          new_item: { 'value': 'storageA'}
          new_value: "{{ item | combine(new_item) }}"
        loop: "{{ vvsets }}"

      - debug:
         msg: "{{ vvsets_new | list }}"

Output:

TASK [debug] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        {
            "key": "lun.101",
            "value": "storageA"
        },
        {
            "key": "lun.101",
            "value": "storageA"
        },
        {
            "key": "lun.201",
            "value": "storageA"
        },
        {
            "key": "lun.301",
            "value": "storageA"
        }
    ]
}
1
  • Thanks Lukas Räpple for the solution.
    – debug
    Oct 6, 2020 at 3:07

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .