在Ansible中检查已安装的yum软件包/ rpm版本并使用它的最佳方法

Der*_*der 4 ansible

我已经在CentOS 7上被Ansible(2.0.0.2)弄湿了。我试图从已安装的rpm / yum软件包中获取版本,但是在运行脚本时遇到警告消息。

Ansible脚本:

---
- name: Get version of RPM
  shell: yum list installed custom-rpm | grep custom-rpm | awk '{print $2}' | cut -d'-' -f1
  register: version
  changed_when: False

- name: Update some file with version
  lineinfile:
    dest: /opt/version.xml
    regexp: "<version>"
    line: "  <version>{{ version.stdout }}</version>"
Run Code Online (Sandbox Code Playgroud)

运行此命令可以正常工作,并且可以完成预期的操作,但是执行后会返回警告:

好的:[默认] => {“已更改”:false,“ cmd”:“安装了yum列表custom-rpm | grep custom-rpm | awk'{print $ 2}'| cut -d'-'-f1”,“ delta“:” 0:00:00.255406“,” end“:” 2016-05-17 23:11:54.998838“,” rc“:0,” start“:” 2016-05-17 23:11:54.743432“ ,“ stderr”:“”,“ stdout”:“ 3.10.2”,“ stdout_lines”:[“ 3.10.2”],“警告”:[“考虑使用yum模块而不是运行yum”]}

[警告]:考虑使用yum模块而不是运行yum

我在Ansible网站上查找了yum模块的信息,但是我真的不想安装/更新/删除任何内容。

我可以简单地忽略它或抑制它,但是我很好奇是否有更好的方法?

Ser*_*ZLY 5

我认为更原生的解决方法是:

- name: get package version
  yum:
    list: package_name
  register: package_name_version

- name: set package version
  set_fact:
    package_name_version: "{{ package_name_version.results|selectattr('yumstate','equalto','installed')|map(attribute='version')|list|first }}"
Run Code Online (Sandbox Code Playgroud)


fre*_*red 5

我只想更新这个旧的讨论,以指出现在有一个软件包模块,可以使此操作更加简单

- name: get the rpm or apt package facts
  package_facts:
    manager: "auto"

- name: show apache2 version
  debug: var=ansible_facts.packages.apache2[0].version
Run Code Online (Sandbox Code Playgroud)

  • 伟大的!如果名称包含连字符,您只需要使用 `ansible_facts.packages['pkg-name']`。 (3认同)

udo*_*dan 2

你这样做的方式完全没问题。导致警告的检查非常简单,只需根据预定义列表检查第一个单词。它忽略进一步的选项,并经常导致警告,这些警告无法用相应的模块解决,就像在yum例一样。

要消除警告,您只需执行以下操作which

shell: `which yum` list installed custom-rpm | grep custom-rpm | awk '{print $2}' | cut -d'-' -f1
Run Code Online (Sandbox Code Playgroud)

which查找 的完整路径yum,然后执行。这是完全相同的事情,但从 Ansible 的角度来看,它调用which,而不是yum避免警告。

如果您想在全球范围内停用此类警告,您可以command_warnings = False在您的ansible.cfg. (参见文档

根据文档,您还可以warn=no在命令末尾添加,但这对我来说确实看起来很奇怪,因为它似乎是命令的一部分。