【问题标题】:how to verify that OS packages are removed or not installed in ansible如何验证操作系统软件包是否已删除或未安装在 ansible 中
【发布时间】:2019-05-22 14:09:50
【问题描述】:

所以我正在编写一个卸载一些操作系统包(在本例中为所有 RedHat ABRT 包)的 ansible 剧本,然后检查它们是否已被卸载。卸载不是问题(它工作正常),但我需要验证软件包是否真的被卸载,然后根据它做一些其他的事情。

这是在 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 包(或任何其他包)?

【问题讨论】:

    标签: ansible yum


    【解决方案1】:

    yumlistname 参数均未表示可以使用通配符。参数列表引用说明:

    要针对 yum list package 运行等效的包名称。除了列出包,use 还可以列出以下内容:installed、updates、available 和 repos。

    列出已安装的包使用

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

    【讨论】:

    • 谢谢@vladimir-botka,但它仍然对我不起作用;我在两台不同的服务器上尝试了你的两个示例(第一台服务器安装了软件包,在测试之前我在第二台服务器上手动卸载了它们)。在所有情况下,我都没有得到“packages_installed”和“packages_available”的输出:ok: [server1] => { "packages_installed": "" } 因为“yumstate”在两台服务器上都是“可用”的,所以奇怪的是第二个代码示例没有显示任何内容。
    • 谢谢,正如你所说,“list: installed”并删除了 yum list 参数的通配符,我得到了所有已安装软件包的列表(yumstate=installed)。现在我需要告诉 jsonquery 过滤 abrt* 包,从 jsonquery 语法来看,这可能很棘手......
    • Keep it Simple, Stupid 并使用 select "installed_pa​​ckages|select('match', 'abrt*')|list"
    • 不幸的是,我无法让它与您提到的 select 语句一起使用,显然这种语法需要 jinja 2.7(我有 2.2,暂时无法预见升级)。无论如何,实际上可能不需要对已安装软件包进行额外检查,因为 Ansible 应该报告以防在使用 yum 卸载软件包时出现问题。在没有这个任务的情况下测试了剧本,它工作正常;无论如何感谢您的帮助和建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2022-01-13
    • 2021-12-05
    • 2022-11-03
    相关资源
    最近更新 更多