Ansible、module_defaults和封装模块



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

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

以下两个剧本都适用于Gentoo,但由于第一个例子中的未知选项getbinpkg以及第二个例子中试图在没有portage的系统上专门使用portage,这两个剧本在Debian等上都失败了。

- 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 }}

是否有任何方法可以通过CCD_;通过";从CCD_ 6模块到CCD_?

我确实在module_defaults上尝试了when来限制设置默认值,有趣的是,它被完全忽略了。

- hosts: localhost
module_defaults:
package:
getbinpkg: yes
when: ansible_facts['distribution'] == 'Gentoo'
tasks:
- package:
name: {{ packages }}

我真的不想惹EMERGE_DEFAULT_OPTS

Q:">如何加载特定于分发的模块默认值">

更新

不幸的是,下面描述的解决方案已经不起作用了。由于某种原因,字典module_defects的键必须是静态的。以下播放失败,出现错误

错误!字段"module_defaults"应该是字典或字典列表,其键必须是静态操作、模块或组名称。只有值可以包含模板。例如:{'ping':"{{ping_deffaults}}&quot

查看详细信息、解决方法和解决方案。


A:当剧本启动时,变量ansible_distribution和其他设置事实不可用。你可以看到剧本中的第一个任务";收集事实"未禁用时。解决方案是在第一个剧本中收集事实并声明一个带有模块默认值的字典,并在剧本的其余部分中使用它们。例如

shell> cat pb.yml
- hosts: test_01
gather_subset: min
tasks:
- debug:
var: ansible_distribution
- set_fact:
my_module_defaults:
Ubuntu:
debug:
msg: "Ubuntu"
FreeBSD:
debug:
msg: "FreeBSD"
- hosts: test_01
gather_facts: false
module_defaults: "{{ my_module_defaults[ansible_distribution] }}" 
tasks:
- debug:

给出

shell> ansible-playbook pb.yml
PLAY [test_01] ****
TASK [Gathering Facts] ****
ok: [test_01]
TASK [debug] ****
ok: [test_01] => 
ansible_distribution: FreeBSD
TASK [set_fact] ****
ok: [test_01]
PLAY [test_01] ****
TASK [debug] ****
ok: [test_01] => 
msg: FreeBSD
PLAY RECAP ****
test_01: ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

最新更新