因此,我正在写一个有趣的剧本,它卸载了某些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软件包(或任何其他软件包)是否已安装?
答案 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"
]