如何验证OS软件包已被删除或未安装在Ansible中



因此,我正在编写一本可卸载某些OS软件包的Ansible Playbook(在这种情况下,所有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":"已安装"的软件包(尽管实际上已安装了它们(:

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软件包(或任何其他软件包(是否已安装?

yum的参数 nast nast nast name name yum的参数说可以使用通配符。引用参数列表的描述:

软件包名称以运行相当于yum list package的相当于。除了列出软件包外,使用还可以列出以下内容:已安装,更新,可用和存储库。

列表已安装软件包使用

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

数据中的软件包 results.packages_installed at server1 ,您发布的,可用。然后

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

最新更新