如何验证是否已删除OS软件包或未安装OS软件包

时间:2019-05-22 14:09:51

标签: ansible yum

因此,我正在写一个有趣的剧本,它卸载了某些OS软件包(在本例中为所有RedHat ABRT软件包),然后检查它们是否已卸载。卸载不是问题(工作正常),但是我需要验证软件包是否确实已卸载,然后根据需要执行其他操作。

这是在RedHat 6.9机器上,并且我正在使用Ansible 2.6。

  - name: list installed ABRT packages
    yum:
      list: abrt*
    register: abrt_packages
    when: ansible_os_family == "RedHat"
  - name: get package info
    set_fact:
      packages_installed: "{{abrt_packages|json_query(jsonquery)}}"
    vars:
      jsonquery: "results[?yumstate=='installed']"
  - debug:
      var: packages_installed

运行上面的ansible代码时,我没有输出-意思是,没有带有“ yumstate”:“ installed”的软件包(尽管实际上已经安装了):

user1@server1: [~]$ rpm -qa | grep abrt
abrt-python-2.0.8-43.el6.x86_64
abrt-addon-ccpp-2.0.8-43.el6.x86_64
abrt-addon-kerneloops-2.0.8-43.el6.x86_64
abrt-cli-2.0.8-43.el6.x86_64
abrt-libs-2.0.8-43.el6.x86_64
abrt-addon-python-2.0.8-43.el6.x86_64
abrt-2.0.8-43.el6.x86_64
abrt-tui-2.0.8-43.el6.x86_64

Yum还显示它们已安装。
如果我将jsonquery修改为:

jsonquery: "results"

然后我得到了:

ok: [server1] => {
    "packages_installed": [
        {
            "arch": "x86_64", 
            "envra": "0:abrt-addon-ccpp-2.0.8-43.el6.x86_64", 
            "epoch": "0", 
            "name": "abrt-addon-ccpp", 
            "release": "43.el6", 
            "repo": "Repo1yum", 
            "version": "2.0.8", 
            "yumstate": "available"
        }, 
        {
            "arch": "x86_64", 
            "envra": "0:abrt-addon-kerneloops-2.0.8-43.el6.x86_64", 
            "epoch": "0", 
            "name": "abrt-addon-kerneloops", 
            "release": "43.el6", 
            "repo": "Repo1yum", 
            "version": "2.0.8", 
            "yumstate": "available"
        }, 
etc.

因此,尽管实际上已安装了ABRT软件包,但它们的“ yumstate”是“可用的”(而不是“已安装”)。这是Ansible yum模块中的错误,还是我做错了什么?我应该如何检查ABRT软件包(或任何其他软件包)是否已安装?

1 个答案:

答案 0 :(得分:1)

yum list name 参数均未说明可以使用通配符。引用参数列表的说明:

  

yum list package等效的软件包名称。除了列出软件包之外,用户还可以列出以下内容:已安装,更新,可用和存储库。

要列出已安装软件包,请使用

jsonquery: "results.packages_installed[?yumstate=='installed'].name"

您发布的 server1 上的数据 results.packages_installed 中的包可用。然后

- set_fact:
    packages_available: "{{ abrt_packages|json_query(jsonquery) }}"
  vars:
    jsonquery: "results.packages_installed[?yumstate=='available'].name"
- debug:
    var: packages_available

给予(节略):

"packages_available": [
    "abrt-addon-ccpp", 
    "abrt-addon-kerneloops"
]