覆盖 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
在 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