我正在尝试在RHEL计算机上安装所有已安装的yum软件包。我可以通过使用不是幂等的shell命令来轻松获得它,并且想要使用yum命令。
Shell命令工作正常:
- name: yum list packages
shell: yum list installed > build_server_info.config
但是当我尝试使用yum命令时,它只是执行但不会给出任何结果:
- name: yum_command
action: yum list=${pkg} list=available
答案 0 :(得分:13)
我可以通过使用非幂等的shell命令轻松获得它
当您查询机器的当前状态时,您无法真正谈论幂等性。
“Idempontent”表示无论您执行某项任务多少次,任务都将确保机器处于所需状态。
查询当前状态时,不会描述所需的状态。无论你做什么,使用什么方法,“幂等”一词都不适用。
关于你没有给出结果的例子 - 你重复了两次相同的参数list
并且任务失败了(它没有,看起来像是一个Ansible怪癖)。
要获取已安装软件包的列表,您应该使用:
- name: yum_command
yum:
list=installed
register: yum_packages
- debug:
var: yum_packages
它将描述每个包的词典列表保存到变量yum_packages
。
然后,您可以使用JSON Query Filter获取单个包(tar
):
- debug: var=item
with_items: "{{yum_packages|json_query(jsonquery)}}"
vars:
jsonquery: "results[?name=='tar']"
得到这样的结果:
"item": {
"arch": "x86_64",
"epoch": "2",
"name": "tar",
"nevra": "2:tar-1.26-31.el7.x86_64",
"release": "31.el7",
"repo": "installed",
"version": "1.26",
"yumstate": "installed"
}
或仅限其版本:
- debug: var=item
with_items: "{{yum_packages|json_query(jsonquery)}}"
vars:
jsonquery: "results[?name=='tar'].version"
"item": "1.26"
答案 1 :(得分:3)
从Ansible 2.5开始,您还可以使用package_facts
模块:它将收集已安装软件包的列表作为Ansible事实。
文档示例:
- name: get the rpm package facts
package_facts:
manager: rpm
- name: show them
debug: var=ansible_facts.packages
答案 2 :(得分:0)
好吧,official Ansible documentation for the yum module
将列表描述为:
"用于/ usr / bin / ansible而不是playbooks的各种(非幂等)命令。"
所以你找到一个幂等的list
调用会让你失去运气。
如果您只想取消changed
输出set the changed_when
parameter to False
。
(另外,重复的list
参数是可疑的。)
答案 3 :(得分:0)
如果您的要求是仅检查一个软件包,并基于此消息要执行另一任务,则可以使用package_facts
模块作为
- name: install docker community edition in rhel8
hosts: localhost
connection: local
tasks:
- name: Gather the rpm package facts
package_facts:
manager: auto
- name: check if docker-ce is already installed
debug:
var: ansible_facts.packages['docker-ce']
- name: using command module to install docker-ce
command: yum install docker-ce --nobest -y
when: "'docker-ce' not in ansible_facts.packages"
register: install_res
- name: whether docker is installed now
debug:
var: install_res