覆盖 Ansible 默认包管理器

Override Ansible default pacakge manager

在 Ansible 2.5 之前,我能够设置覆盖 Ansible 的 package 模块使用的默认包管理器以使用不同的 Ansible 模块。在这样的剧本中看起来像:

tasks:
  - set_fact:                                                                                                                                                                                        
      ansible_pkg_mgr: pacaur  

升级到 Ansible 2.5.3 后,上面的设置不再更改包管理器,package 仍然尝试使用 pacman 模块,这是我的 OS 的默认设置。有什么关于覆盖包管理器事实的建议吗?

使用包模块时,您可以使用 use 指令指定要使用的包管理器。例如

- package:
    name: spotify
    use: pacaur

不建议覆盖 ansible 收集的事实,因为它会导致意外行为。

回答你的问题:

据我所知,这应该行不通,因为 ansible 正在查找 use directive (apt/yum/pacman) 中的指定模块或 ansible_pkg_mgr 中的值是否存在与否。

package 是一个动作插件,它 returns os 基于发行版/操作系统的包管理器,它要求包管理器作为 Ansible 模块实现。包插件的实现在 2.4 版和 2.5 版之间略有变化。可以参考代码here。如果模块不可用,ansible 将立即失败。

更新

所以,覆盖不再起作用的原因是,随着 2.5 版本的发布,所有 ansible facts 都被移到了 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