ansible

Ansible - Remove key-value Pair


I have a list of dictionaries

member:
  - name: test2
    orig: test2
  - name: test1
    orig: test1

and would like to remove the orig key and value from all dictionaries in the list.

- name: Print Firewall Group Member
  debug:
    msg: "{{ item }}"
  loop: "{{ member }}"
TASK [Print Firewall Group Member] *****************************************************************************************
ok: [fortigate01] => (item={'name': 'test2', 'orig': 'test2'}) => {
    "msg": {
        "name": "test2",
        "orig": "test2"
    }
}
ok: [fortigate01] => (item={'name': 'test1', 'orig': 'test1'}) => {
    "msg": {
        "name": "test1",
        "orig": "test1"
    }
}


Solution

  • Update

    Since community.general 9.1.0 use filters:

    The below declarations

    names: "{{ member | community.general.remove_keys(target=['orig'])}}"
    names: "{{ member | community.general.keep_keys(target=['name'])}}"
    names: "{{ member | ansible.utils.remove_keys(target=['orig']) }}"
    

    give the same results

    names:
      - name: test2
      - name: test1
    

    Notes

    • Example of a complete playbook for testing
    - hosts: localhost
    
      vars:
    
        member:
          - {name: test2, orig: test2}
          - {name: test1, orig: test1}
    
        names1: "{{ member | community.general.remove_keys(target=['orig'])}}"
        names2: "{{ member | community.general.keep_keys(target=['name'])}}"
        names3: "{{ member | ansible.utils.remove_keys(target=['orig']) }}"
    
      tasks:
    
        - debug:
            var: names1
        - debug:
            var: names2
        - debug:
            var: names3
    
    shell> ansible-galaxy collection install community.general --upgrade
    

    Original answer

    1. Use the filter ansible.utils.remove_keys. For example, given simplified data
    member:
      - name: test2
        orig: test2
      - name: test1
        orig: test1
    

    Declare the variable

    names: "{{ member | ansible.utils.remove_keys(target=['orig']) }}"
    

    gives

    names:
      - name: test2
      - name: test1
    
    1. Optionally, use the filter ansible.utils.keep_keys. The declaration below gives the same result
    names: "{{ member | ansible.utils.keep_keys(target=['name']) }}"
    
    1. The next option is json_query
    names: "{{ member | json_query('[].{name: name}') }}"
    

    Example of a complete playbook for testing

    - hosts: localhost
    
      vars:
    
        member:
          - name: test2
            orig: test2
          - name: test1
            orig: test1
    
        names: "{{ member | ansible.utils.remove_keys(target=['orig']) }}"
        name2: "{{ member | ansible.utils.keep_keys(target=['name']) }}"
        name3: "{{ member | json_query('[].{name: name}') }}"
    
      tasks:
    
        - debug:
            var: names
        - debug:
            var: name2
        - debug:
            var: name3