我一直在使用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模块的信息,但我真的不想安装/更新/删除任何内容。
我可以简单地忽略它或压制它,但我很好奇是否有更好的方法?
答案 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页面