Roberto Esparis
Roberto Esparis

Reputation: 21

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

Upvotes: 2

Views: 683

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 68034

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

Upvotes: 3

Related Questions