简体   繁体   中英

Extract values from a list of dictionaries in Ansible

I have this playbook and I need to find a way to display the values of the list of dictionaries under prerequisite knowing that we have different key names. how can I display theses values keeping the same syntax of my playbook?

Expected output:

"linux/mysql/8.0.19/prerequis/mysql-community-common-8.0.19-1.el7.x86_64.rpm"
"mysql-community-common-8.0.19-1.el7.x86_64"
"linux/mysql/8.0.19/prerequis/mysql-community-libs-8.0.19-1.el7.x86_64.rpm"
"mysql-community-libs-8.0.19-1.el7.x86_64"
"linux/mysql/8.0.19/prerequis/mysql-community-client-8.0.11-1.el7.x86_64.rpm"
"mysql-community-client-8.0.11-1.el7.x86_64"
"linux/mysql/8.0.19/prerequis/mysql-shell-8.0.19-1.el7.x86_64.rpm"
"mysql-shell-8.0.19-1.el7.x86_64"

- name: "extract values from a list of dictionaries"
 hosts: localhost
 tasks:
 - name: "adding variables"
   set_fact:
     products:
       mysql_8_0_19:
         CentOS_7:
           signature: "mysql-community-server-8.0.19-1.el7.x86_64"
           url: "linux/mysql/8.0.19/mysql-community-server-8.0.19-1.el7.x86_64.rpm"
         pymysql_url: "linux/mysql/8.0.19/prerequis/PyMySQL-0.9.3.tar.gz"
         prerequisite:
         - mysql_c_common_url: "linux/mysql/8.0.19/prerequis/mysql-community-common-8.0.19-1.el7.x86_64.rpm"
           mysql_c_common_signature: "mysql-community-common-8.0.19-1.el7.x86_64"
         - mysql_c_libs_url: "linux/mysql/8.0.19/prerequis/mysql-community-libs-8.0.19-1.el7.x86_64.rpm"
           mysql_c_libs_signature: "mysql-community-libs-8.0.19-1.el7.x86_64"
         - mysql_c_client_url: "linux/mysql/8.0.19/prerequis/mysql-community-client-8.0.11-1.el7.x86_64.rpm"
           mysql_c_client_signature: "mysql-community-client-8.0.11-1.el7.x86_64"
         - mysql_shell_url: "linux/mysql/8.0.19/prerequis/mysql-shell-8.0.19-1.el7.x86_64.rpm"
           mysql_shell_signature: "mysql-shell-8.0.19-1.el7.x86_64"

 - name: " display "
   debug:
     msg: "{{ item }}"
   with_items: "{{ products.mysql_8_0_19.prerequisite }}"'

Getting the values of a dictionary in Ansible with an "unknown" set of keys usually call for the usage of dict2items .

Your use case does fit the bill, you just have to map this filter on all elements of the prerequisite list, then flatten it and finally extract the values with another map filter.

So, you can achieve what you need with the task:

- debug:
    msg: "{{ item }}"
  loop: >-
    {{ 
      products.mysql_8_0_19.prerequisite 
      | map('dict2items') 
      | flatten 
      | map(attribute='value') 
    }}

You might want to add a | list | list filter at the end if you are on an old version of Ansible and get an error like <generator object do_map at 0x7f3xxxxx>


Given the task:

- debug:
    var: >-
      products.mysql_8_0_19.prerequisite
      | map('dict2items')
      | flatten
      | map(attribute='value')
  vars:
    products:
      mysql_8_0_19:
        prerequisite: "{{ prerequisite }}"
    prerequisite:
      - mysql_c_common_url: >-
          linux/mysql/8.0.19/prerequis{#- allows line wrap -#}
          /mysql-community-common-8.0.19-1.el7.x86_64.rpm
        mysql_c_common_signature: >-
          mysql-community-common-8.0.19-1.el7.x86_64
      - mysql_c_libs_url: >-
          linux/mysql/8.0.19/prerequis{#- allows line wrap -#}
          /mysql-community-libs-8.0.19-1.el7.x86_64.rpm
        mysql_c_libs_signature: >-
          mysql-community-libs-8.0.19-1.el7.x86_64
      - mysql_c_client_url: >-
          linux/mysql/8.0.19/prerequis{#- allows line wrap -#}
          /mysql-community-client-8.0.11-1.el7.x86_64.rpm
        mysql_c_client_signature: >-
          mysql-community-client-8.0.11-1.el7.x86_64
      - mysql_shell_url: >-
          linux/mysql/8.0.19/prerequis{#- allows line wrap -#}
          /mysql-shell-8.0.19-1.el7.x86_64.rpm
        mysql_shell_signature: >-
          mysql-shell-8.0.19-1.el7.x86_64

This yields:

- linux/mysql/8.0.19/prerequis/mysql-community-common-8.0.19-1.el7.x86_64.rpm
- mysql-community-common-8.0.19-1.el7.x86_64
- linux/mysql/8.0.19/prerequis/mysql-community-libs-8.0.19-1.el7.x86_64.rpm
- mysql-community-libs-8.0.19-1.el7.x86_64
- linux/mysql/8.0.19/prerequis/mysql-community-client-8.0.11-1.el7.x86_64.rpm
- mysql-community-client-8.0.11-1.el7.x86_64
- linux/mysql/8.0.19/prerequis/mysql-shell-8.0.19-1.el7.x86_64.rpm
- mysql-shell-8.0.19-1.el7.x86_64

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM