我有两组主机: pc和Servers我有2个group_vars (pc和servers),每个文件中的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发布于 2014-05-25 20:39:48
这不是个bug。根据关于变量优先级的docs,你不应该在多个地方定义一个变量,并试图保持它的简单性。Michael DeHaan (Ansible的首席开发人员) responded在这个话题上回答了一个类似的问题:
通常我发现剧本的目的是将主机绑定到角色,因此单个角色应该包含包列表。
我会使用角色,因为它是更干净的IMO。
如果您确实需要(但这不是推荐的方式),可以在ansible.cfg中设置hash_behaviour选项:
[defaults]
hash_behaviour = merge这将导致在重新定义散列(dict)时合并两个值,而不是用新值替换旧值。但是,这不适用于列表,因此您需要创建列表的散列,如下所示:
group_vars/all/package.yml:
packages:
all: [pkg1, pkg2]group_vars/servers/package.yml:
packages:
servers: [pkg3, pkg4]不过,在攻略中循环有点复杂。
发布于 2014-08-23 19:09:30
如果你想使用这样的方案。您应该在ansible.cfg中设置hash_behaviour选项:
[defaults]
hash_behaviour = merge此外,您必须使用字典而不是列表。为了防止重复,我建议使用名称作为键,例如:
group_vars/servers/packages.yml:
packages:
package_name1:
package_name2:group_vars/pc/packages.yml:
packages:
package_name3:
package_name4:在攻略任务中(| default({}) -对于缺少的"package“变量情况):
- name: install host packages
yum: name={{ item.key }} state=latest
with_dict: packages | default({})https://stackoverflow.com/questions/23525546
复制相似问题