我有两个主机:pc和Servers 我有2个group_vars(个人电脑和服务器),每个文件中包含package.yml 这些文件定义了要在PC主机和服务器主机上安装的软件包列表
我有安装默认包
的角色问题是:角色任务只考虑group_vars / pc / packages.yml,未安装group_vars / servers / packages.yml中的软件包
当然我想要的是安装为pc和服务器定义的包
我不知道这是一个错误还是一个功能......
感谢您的帮助
这是配置:
# file: production
[pc]
armen
kerbel
kerzo
[servers]
kerbel
---
# packages on servers
packages:
- lftp
- mercurial
---
# packages on pc
packages:
- keepassx
- lm-sensors
- hddtemp
答案 0 :(得分:7)
如果你想使用这样的方案。您应该在ansible.cfg中设置hash_behaviour选项:
[defaults]
hash_behaviour = merge
此外,您必须使用词典而不是列表。为了防止重复,我建议使用名称作为键,例如:
group_vars /服务器/ packages.yml:
packages:
package_name1:
package_name2:
group_vars / PC / packages.yml:
packages:
package_name3:
package_name4:
在剧本任务中(|默认({}) - 对于缺席"包"变量案例):
- name: install host packages
yum: name={{ item.key }} state=latest
with_dict: packages | default({})
答案 1 :(得分:4)
这不是一个错误。根据关于变量优先级的docs,您不应该在多个位置定义变量并尝试保持简单。 Michael DeHaan(Ansible的主要负责人)responded就此主题提出类似问题:
通常我发现播放的目的是将主机绑定到角色,因此各个角色应该包含包列表。
我会使用角色,因为它有点清洁IMO。
如果你真的想要(这不是推荐的方式),你可以在ansible.cfg中设置hash_behaviour选项:
[defaults]
hash_behaviour = merge
这将在重新定义hash(dict)时导致两个值的合并,而不是用新值替换旧值。但是,这不适用于列表,因此您需要创建列表哈希,例如:
group_vars /所有/ package.yml:
packages:
all: [pkg1, pkg2]
group_vars /服务器/ package.yml:
packages:
servers: [pkg3, pkg4]
循环虽然在剧本中虽然有点复杂。