Ansible 2.5.3版本下如何覆盖默认包管理器fact?
解决Ansible 2.5+无法覆盖
ansible_pkg_mgr的问题 我之前也踩过这个坑!Ansible 2.5版本对包管理器fact的处理逻辑做了调整,直接用set_fact覆盖ansible_pkg_mgr的方法已经失效了——因为现在这个fact是由setup模块自动检测生成的,它的优先级高于set_fact设置的值,所以你之前的写法会被系统默认的检测结果覆盖。
下面给你几个亲测有效的解决方案:
方法一:通过环境变量临时指定
执行playbook时直接通过环境变量传递包管理器参数,这种方式适合临时测试或者单次执行的场景:
ANSIBLE_PKG_MGR=pacaur ansible-playbook your_playbook.yml
方法二:在playbook的vars中定义
如果需要在playbook里固定设置,可以直接在vars块中定义ansible_pkg_mgr,变量优先级会高于setup模块收集的fact:
- name: 自定义包管理器的playbook hosts: your_hosts vars: ansible_pkg_mgr: pacaur tasks: - name: 安装测试包 package: name: neovim state: present
方法三:在inventory中针对主机/组设置
如果需要给特定主机或主机组统一设置包管理器,可以在inventory文件里配置:
# inventory文件示例 [arch_hosts] host1 ansible_pkg_mgr=pacaur host2 ansible_pkg_mgr=pacaur [arch_hosts:vars] ansible_pkg_mgr=pacaur # 给整个组设置
补充说明
为什么之前的set_fact方法在2.5前有效?因为早期Ansible中ansible_pkg_mgr只是一个普通fact,set_fact可以覆盖它;但2.5+版本后,这个变量被升级为具有特殊优先级的"魔法变量",setup模块的检测结果优先级更高,所以必须用上述更高优先级的变量设置方式才能生效。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

