从 Ansible 中的字典列表中提取值

问题描述 投票:0回答:1

我有这个剧本,我需要找到一种方法来显示

prerequisite
下的字典列表的值,因为我知道我们有不同的键名称。如何显示这些值并保持与我的剧本相同的语法?

预期输出:

"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 }}"'
list loops dictionary ansible jinja2
1个回答
0
投票

在 Ansible 中使用一组“未知”键获取字典的值通常需要使用 dict2items

您的用例确实符合要求,您只需对

map

列表的所有元素进行

prerequisite
过滤器,然后
flatten
 它,最后使用另一个 
map
过滤器提取值。
因此,您可以通过任务实现所需的目标:

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

如果您使用旧版本的 Ansible 并收到类似 | list

 的错误,您可能需要在末尾添加 
<generator object do_map at 0x7f3xxxxx> 过滤器

给定任务:

- 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

这产生:

- 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

	
© www.soinside.com 2019 - 2024. All rights reserved.