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

时间:2016-05-17 23:38:13

标签: ansible

我一直在使用CentOS 7上的Ansible(2.0.0.2)。我正在尝试从已安装的rpm / yum软件包中获取一个版本,但在运行脚本时遇到了警告消息。 / p>

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>"

运行此方法可以正常运行并执行它应该执行的操作,但它在执行后会返回警告:

  

ok:[默认] =&gt; {“已更改”:false,“cmd”:“yum list installed 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 site上查找了yum模块的信息,但我真的不想安装/更新/删除任何内容。

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

10 个答案:

答案 0 :(得分:4)

我认为更多原生的安慰方式是:

- 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 }}"

答案 1 :(得分:3)

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

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

- name: show apache2 version
  debug: var=ansible_facts.packages.apache2[0].version

答案 2 :(得分:2)

按照建议使用YUM模块。这确实有帮助。您无需进行任何安装/更新/删除。 更多内容为您提供了更多选项,例如如果已经安装了软件包,它将忽略它。

答案 3 :(得分:2)

在您的情况下可以取消此警告。使用args之类的:

---
- 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
  args:
    warn: no

等同于shell:行上的warn=no,但更整洁。

答案 4 :(得分:2)

peraol的Varaint回答用已安装的软件包版本号设置事实进行进一步的测试


- name: Find if custom_rpm is installed
  yum:
    list: custom_rpm
  register: custom_rpm_yum_packages
  when: ansible_os_family == "RedHat"

- name: Extract custom_rpm actual installed version
  set_fact:
     actual_custom_rpm_version:  "{{custom_rpm_yum_packages|json_query(jsonquery)}}"
  vars:
     jsonquery: "results[?yumstate=='installed'].version"
  when: ansible_os_family == "RedHat"

- debug:
    var: actual_custom_rpm_version

答案 5 :(得分:1)

你这样做的方式非常好。导致警告的检查非常简单,只是根据预定义的列表检查第一个。它忽略了其他选项,并且经常导致无法使用相应模块解决的警告,如yum情况。

要摆脱警告,您只需执行which

即可
shell: `which yum` list installed custom-rpm | grep custom-rpm | awk '{print $2}' | cut -d'-' -f1

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

如果您想全局停用此类警告,可以在command_warnings = False中设置ansible.cfg。 (见docs

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

答案 6 :(得分:1)

如其他人所述,您可以使用shell命令。 我发现这个答案对于使用ansible yum模块而不是ansible警告建议的shell命令非常有用: How to get the installed yum packages with Ansible?

总结这里以便于参考: 您可以在ansible中使用本机yum模块中的yum list。

- hosts: localhost tasks: - name: Get installed packages sudo: yes yum: list=installed register: yum_packages changed_when: False

要查看yum_packages的内容: - debug: var: yum_packages yum_packages包含所有已安装软件包的列表。

然后您可以通过以下方式获取感兴趣的包的版本: - debug: var=item with_items: "{{yum_packages|json_query(jsonquery)}}" vars: jsonquery: "results[?name=='tar'].version"

请注意,jsonquery仅从ansible 2.2开始提供。

答案 7 :(得分:1)

我不喜欢这些答案。

  - name: use command to pull version
    command: '/usr/bin/rpm -qa custom-rpm --queryformat %{VERSION}'
    register: version
    ignore_warnings: True
    changed_when: False

答案 8 :(得分:1)

如何使用RPM直接检索版本而不是通过各种管道:

rpm -q --qf "%{VERSION}" custom-rpm

答案 9 :(得分:0)

尝试添加ignore_errors 处理这个的选项。有关详细信息和示例,请参阅Error Handing页面