如何使用Ansible获取已安装的yum包?

时间:2017-01-09 15:44:00

标签: ansible ansible-playbook idempotent

我正在尝试在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

4 个答案:

答案 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