如何合并Ansible的package_facts与版本检查任务并解决packages字段未找到的错误?
如何合并Ansible的package_facts与版本检查任务并解决packages字段未找到的错误?
嗨,我来帮你搞定这个问题!你遇到的报错其实是Ansible的一个小细节导致的:当你在同一个任务里把package_facts和failed_when放在一起时,package_facts模块刚生成的packages facts还没来得及被同步到全局的ansible_facts变量里,所以直接引用ansible_facts.packages就会提示找不到属性。
要解决这个问题,我们可以把package_facts的执行结果先注册到一个临时变量中,然后用这个临时变量来做版本检查和失败判断,同时还能顺便处理redis-server未安装的情况(避免出现KeyError)。
下面是合并后的完整任务代码:
- name: Get Package infos and check redis-server version tags: redis ansible.builtin.package_facts: manager: auto register: pkg_facts_result failed_when: > 'redis-server' not in pkg_facts_result.ansible_facts.packages or pkg_facts_result.ansible_facts.packages['redis-server'][0].version is version('4.0', '<')
我来拆解一下这段代码的逻辑:
- 用
register: pkg_facts_result把package_facts模块的执行结果(包括生成的包facts)存到临时变量里 failed_when的条件分两种情况触发失败:- 如果系统里根本没安装redis-server,直接判定任务失败
- 如果已经安装了redis-server,但版本低于4.0,同样判定任务失败
如果你不想在redis-server未安装时触发失败,只想检查已安装的版本是否达标,可以调整failed_when的条件:
- name: Get Package infos and check redis-server version (only if installed) tags: redis ansible.builtin.package_facts: manager: auto register: pkg_facts_result failed_when: > 'redis-server' in pkg_facts_result.ansible_facts.packages and pkg_facts_result.ansible_facts.packages['redis-server'][0].version is version('4.0', '<')
这样修改后,只有当redis-server已安装但版本不够时,任务才会失败;如果没安装,任务会正常完成。
备注:内容来源于stack exchange,提问作者MaKaNu
相关产品推荐
相关产品推荐

