我有一个分为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)
这不是一个错误。根据关于变量优先级的文档,您不应该在多个地方定义一个变量并尽量保持简单。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)
归档时间: |
|
查看次数: |
20080 次 |
最近记录: |