在Ansible 2.5之前,我能够设置覆盖Ansible的package
模块使用的默认包管理器,以使用不同的Ansible模块。像这样的剧本看起来像:
tasks:
- set_fact:
ansible_pkg_mgr: pacaur
升级到Ansible 2.5.3设置后,上面不再更改软件包管理器,package
仍然尝试使用pacman
模块,这是我的操作系统的默认模块。有关覆盖包管理器事实的任何建议吗?
答案 0 :(得分:4)
使用包模块时,可以使用use
指令指定要使用的包管理器。例如
- package:
name: spotify
use: pacaur
不建议覆盖ansible收集的事实,因为这会导致意外行为。
回答你的问题:
从我看到这应该不起作用,因为ansible正在进行查找以查看use directive
(apt / yum / pacman)中的指定模块或ansible_pkg_mgr
中的值是否存在
package
是一个动作插件,它根据分发/操作系统返回os包管理器,它需要将包管理器实现为Ansible模块。版本2.4 abd 2.5之间的包插件的实现略有变化。您可以参考代码here。如果模块不可用,则会立即失败。
<强> 更新 强>
因此,覆盖不再起作用的原因是因为,在2.5版本中,所有ansible事实都被移动到ansible_facts.*
命名空间。 ansible_*
命名空间仍然可用,但将在以后的版本中弃用。
当您查看上面链接的文件时,您会注意到以下更改
在2.4版本中
module = self._templar.template('{{ansible_pkg_mgr}}')
和2.5
module = self._templar.template('{{ansible_facts.pkg_mgr}}')
因此,在2.5版本中,程序包插件从ansible_facts.pkg_mgr
获取事实(pkg_mgr)的值,因此您需要将该事实设置为pacaur而不是ansible_pkg_mgr
。所以你的设定事实应该如下,你的剧本将像以前一样工作。
- set_fact:
ansible_facts:
pkg_mgr: pacaur