在ansible playbook中仅显示yum列表中的某些字典值

问题描述:

我创建了一个手册,用于检查是否在基于RHEL的服务器上使用“yum”Ansible模块安装了程序包,然后显示结果。在ansible playbook中仅显示yum列表中的某些字典值

我的任务如下;

角色/ LINUX/yumcheck /任务/ main.yml

- name: Check for installed packages 
    yum: list={{ item.package }} 

    with_items: 
    - { package: 'package1' } 
    - { package: 'package2' } 
    - { package: 'package3' } 

    register: yumlist 
- debug: var=yumlist 

的剧本正确地输出以下列格式的结果;

"results": [ 
     { 
      "_ansible_item_result": true, 
      "_ansible_no_log": false, 
      "changed": false, 
      "invocation": { 
       "module_args": { 
        "conf_file": null, 
        "disable_gpg_check": false, 
        "disablerepo": null, 
        "enablerepo": null, 
        "exclude": null, 
        "install_repoquery": true, 
        "list": "python", 
        "name": null, 
        "state": "installed", 
        "update_cache": false, 
        "validate_certs": true 
       }, 
       "module_name": "yum" 
      }, 
      "item": { 
       "package": "python" 
      }, 

yum list模块还会显示“available”包。当使用包名称(例如python)作为多个可用包运行此playbook时,输出可能变得非常冗长。我的目标是让剧本仅输出某些字典值(我相信它们被称为字典值)。

如何格式化结果以仅显示诸如“状态”(已安装或未安装)和软件包名称等潜在信息?

我尝试以与使用括号或花括号显示主机的事实相同的方式显示信息,例如{{results.state}},但Ansible抱怨变量未定义。我一直无法在网上找到这个问题的类似例子。我的目标是简单而干净地显示是否安装了软件包列表,而没有所有额外的臃肿信息。

感谢。

使用map过滤器:

- debug: msg="{{ yum_list.results | map(attribute='invocation.module_args.state') | list }}" 
+0

谢谢你,这个工作对我的需要。 – Avalon

+0

我注意到yum模块正在返回一个状态:几乎安装了所有的东西。例如,我在我的手册中插入了“假冒包装”。这个包显然不存在,并且不可用。尽管如此,Ansible仍然会将状态恢复为“已安装”状态。 – Avalon

您可以使用地图过滤器提取你以后变量, http://docs.ansible.com/ansible/playbooks_filters.html#extracting-values-from-containers

有它的一个例子在这里被使用, http://docs.ansible.com/ansible/ec2_vpc_subnet_facts_module.html

yum_list.results[0].invocation.module_args.state 

应该给你国家的价值。