覆盖Ansible默认的pacakge管理器

时间:2018-05-25 01:49:18

标签: ansible ansible-facts

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

tasks:
  - set_fact:                                                                                                                                                                                        
      ansible_pkg_mgr: pacaur  

升级到Ansible 2.5.3设置后,上面不再更改软件包管理器,package仍然尝试使用pacman模块,这是我的操作系统的默认模块。有关覆盖包管理器事实的任何建议吗?

1 个答案:

答案 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