我有以下工作任务:
- name: Get Package infos
ansible.builtin.package_facts:
manager: auto
- name: Test redis-server version
ansible.builtin.assert:
that:
- ansible_facts.packages['redis-server'][0].version is version('4.0', '>=')
我想知道我是否能够将这些任务合并为一个任务:
- name: Get Package infos
tags: redis
ansible.builtin.package_facts:
manager: auto
failed_when: ansible_facts.packages['redis-server'][0].version is version('4.0', '<')
但如果我这样做,我会收到很长的错误消息,其结尾为:
The error was: error while evaluating conditional
(ansible_facts.packages['redis-server'][0].version is version('4.0', '<')):
'dict object' has no attribute 'packages'. 'dict object' has no attribute 'packages'"}
似乎那个场域packages
此时并不存在。什么可以解决这个方法?
一个简约的选择是
(可选)还测试rc
这个任务不会改变任何事情。禁止报告变化的状态
笔记
可以使用注册变量中的ansible_facts.packages 。但是,模块package_facts在检查 redis 版本时并不实用,因为它依赖于操作系统并且速度慢。例如,
在 Ubuntu 上给出
与上述命令任务等效的是
正确的是,ansible_facts 在任务完成和同一任务评估其 failed_when 之间不会更新。
按原样使用您的第一次尝试,
package_facts
然后断言。完全可以理解它在做什么。package_facts 检查系统包管理器,这是集中软件安装方式的一个不错的选择。(如果您的操作系统发行版受此模块支持。)您可以通过其他方式安装,但这需要其他方法来维护和修补它。
以标准格式收集有关所有包的事实,并在六个包管理器中进行抽象,值得包管理器查询的少量性能成本。与执行
rpm -qa
when -all 类似并不是严格必要的。尽管在 rpm 的情况下它使用的是 Python 绑定而不是程序。断言是一个操作插件,因此不需要远程任何地方或运行外部命令。因此,结合这些任务不会节省太多运行时间。
仅收集数据的任务,从而增加游戏摘要中的任务数量,但从不改变内容,对我来说是可以接受的风格。在 Ansible 中做许多重要的事情都需要进行设置,而这些任务并不总是会改变任何东西。
小建议,考虑将版本字符串设置为变量。应用程序的主要版本要求可能不会经常改变。然而,在测试您的角色时,最好看看失败情况是什么样的。