因此,我正在编写一本可卸载某些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"
]