【问题标题】:How can I get the installed YUM packages with Ansible?如何使用 Ansible 获取已安装的 yum 包?
【发布时间】:2017-01-09 15:43:59
【问题描述】:

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

【问题讨论】:

    标签: ansible ansible-playbook idempotent


    【解决方案1】:

    我可以通过使用非幂等的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"
    

    【讨论】:

    • 如果您只是想要在其他地方使用的软件包列表,您正在寻找的jsonquery{{ yum_packages | json_query('results[*].name') }}。例如,与 | difference() 一起获取丢失包的列表非常有用。
    【解决方案2】:

    从 Ansible 2.5 开始,您还可以使用 package_facts 模块:它将收集已安装包的列表作为 Ansible 事实。

    文档中的示例:

    - name: get the rpm package facts
      package_facts:
        manager: rpm
    
    - name: show them
      debug: var=ansible_facts.packages
    

    【讨论】:

      【解决方案3】:

      好吧,official Ansible documentation for the yum module 将列表描述为:

      “用于 /usr/bin/ansible 而不是 playbook 的各种(非幂等)命令。”

      因此,您将无法找到幂等 list 调用。

      如果您只想抑制 changed 输出,set the changed_when parameter to False

      (另外,有重复的list 参数是可疑的。)

      【讨论】:

      • 这将再次与使用 shell 模块的方法相同。
      • 是的。使用 techraf 的解决方案,它具有我完全错过的额外 register 操作。
      【解决方案4】:

      如果您的要求是只检查一个包,并且基于此您想执行另一项任务,您可以使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 2011-11-23
        相关资源
        最近更新 更多