Ansible、模块默认值和包模块

Ansible、模块默认值和包模块,ansible,Ansible,因此,我试图为我们的环境编写尽可能与操作系统无关的角色和剧本。 我们使用RHEL、Debian、Gentoo和FreeBSD Gentoo需要getbinpkg,我可以使用module\u默认值对community.general.portage的所有调用设置默认值 但是,通过设置变量并调用package,我可以并且确实在其他3个系统上安装一些软件包 以下两个重头戏都适用于Gentoo,但由于第一个例子中的未知选项getbinpkg,以及第二个例子中没有portage的系统上尝试专门使用port

因此,我试图为我们的环境编写尽可能与操作系统无关的角色和剧本。
我们使用RHEL、Debian、Gentoo和FreeBSD

Gentoo需要
getbinpkg
,我可以使用
module\u默认值对
community.general.portage
的所有调用设置默认值
但是,通过设置变量并调用
package
,我可以并且确实在其他3个系统上安装一些软件包

以下两个重头戏都适用于Gentoo,但由于第一个例子中的未知选项getbinpkg,以及第二个例子中没有portage的系统上尝试专门使用portage,因此在Debian etc上都失败了

- hosts: localhost
  module_defaults:
    package:
      getbinpkg: yes
  tasks:
    - package:
        name: {{ packages }}

- hosts: localhost
  module_defaults:
    community.general.portage:
      getbinpkg: yes
  tasks:
    - community.general.portage:
        name: {{ packages }}
有没有办法将
模块通过
软件包
模块传递到
移植
模块

我在
module\u defaults
上尝试了
来限制默认设置,有趣的是,它被完全忽略了

- hosts: localhost
  module_defaults:
    package:
      getbinpkg: yes
    when: ansible_facts['distribution'] == 'Gentoo'
  tasks:
    - package:
        name: {{ packages }}
我真的不想弄乱
EMERGE\u DEFAULT\u OPTS

Q:如何加载特定于分发的内容?

答:playbook启动时,变量ansible_分布和其他设置事实不可用。未禁用时,您可以在剧本“收集事实”中看到第一个任务。解决方案是在第一个剧本中收集事实并声明一个带有模块默认值的字典,然后在剧本的其余部分中使用它们。比如说

shell>cat pb.yml
-主持人:test_01
集合子集:min
任务:
-调试:
var:ansible_分布
-设定事实:
我的模块默认设置:
Ubuntu:
调试:
msg:“Ubuntu”
FreeBSD:
调试:
味精:“FreeBSD”
-主持人:test_01
收集事实:错误
模块_默认值:{{my_模块_默认值[ansible_distribution]}”
任务:
-调试:
给予

shell>ansible剧本pb.yml
播放[测试01]****
任务[收集事实]****
ok:[测试单元01]
任务[调试]****
确定:[测试\u 01]=>
ansible_分布:FreeBSD
任务[设置事实]****
ok:[测试单元01]
播放[测试01]****
任务[调试]****
确定:[测试\u 01]=>
msg:FreeBSD
重演****
测试\u 01:确定=4更改=0无法访问=0失败=0跳过=0获救=0忽略=0