Ansible:托管在多个组中

dyp*_*ype 13 ansible

我有一个分为2组的主机:pc和服务器我有2个group_vars(pc和服务器),每个文件packages.yml这些文件定义要在pc主机和服务器主机上安装的软件包列表

我有一个安装默认包的角色

问题是:角色任务只考虑group_vars/pc/packages.yml,未安装group_vars/servers/packages.yml中的软件包

当然我想要的是安装为pc和服务器定义的包

我不知道这是一个bug还是一个功能......

谢谢你的帮助

这是配置:

# file: production
[pc]
armen
kerbel
kerzo

[servers]
kerbel

---
# packages on servers
packages:
  - lftp
  - mercurial

---
# packages on pc
packages:
  - keepassx
  - lm-sensors
  - hddtemp
Run Code Online (Sandbox Code Playgroud)

hka*_*iti 7

这不是一个错误。根据关于变量优先级的文档,您不应该在多个地方定义一个变量并尽量保持简单。Michael DeHaan(Ansible 的首席开发人员)就这个话题回答了一个类似的问题:

通常我发现 play 的目的是将主机绑定到角色,所以各个角色应该包含包列表。

我会使用角色,因为它更清洁 IMO。

如果你真的想要(这不是推荐的方式),你可以在ansible.cfg中设置hash_behaviour选项:

[defaults]
hash_behaviour = merge
Run Code Online (Sandbox Code Playgroud)

这将导致在重新定义散列 (dict) 时合并两个值,而不是用新值替换旧值。但是,这不适用于列表,因此您需要创建列表的散列,例如:

group_vars/all/package.yml:

packages:
    all: [pkg1, pkg2]
Run Code Online (Sandbox Code Playgroud)

group_vars/servers/package.yml:

packages:
    servers: [pkg3, pkg4]
Run Code Online (Sandbox Code Playgroud)

虽然在剧本中循环有点复杂。


小智 7

如果你想使用这样的方案.您应该在ansible.cfg中设置hash_behaviour选项:

[defaults]
hash_behaviour = merge
Run Code Online (Sandbox Code Playgroud)

此外,您必须使用词典而不是列表.为了防止重复,我建议使用名称作为键,例如:

group_vars /服务器/ packages.yml:

packages:
 package_name1:
 package_name2:
Run Code Online (Sandbox Code Playgroud)

group_vars/PC/packages.yml:

packages:
 package_name3:
 package_name4:
Run Code Online (Sandbox Code Playgroud)

并且在playbook任务中(| default({}) - 对于缺少"package"变量的情况):

- name: install host packages
  yum: name={{ item.key }} state=latest
  with_dict: packages | default({})
Run Code Online (Sandbox Code Playgroud)