Ansible:托管在多个组中

时间:2014-05-07 18:29:32

标签: ansible

我有两个主机: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

2 个答案:

答案 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]

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