首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible :多个组中的主机

Ansible :多个组中的主机
EN

Stack Overflow用户
提问于 2014-05-08 02:29:32
回答 2查看 26.9K关注 0票数 17

我有两组主机: pc和Servers我有2个group_vars (pc和servers),每个文件中的packages.yml文件定义了要安装在pc主机和服务器主机上的软件包的列表

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

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

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

我不知道这是一个bug还是一个特性...

谢谢你的帮忙

配置如下:

代码语言:javascript
复制
# file: production
[pc]
armen
kerbel
kerzo

[servers]
kerbel

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

---
# packages on pc
packages:
  - keepassx
  - lm-sensors
  - hddtemp
EN

回答 2

Stack Overflow用户

发布于 2014-05-25 20:39:48

这不是个bug。根据关于变量优先级的docs,你不应该在多个地方定义一个变量,并试图保持它的简单性。Michael DeHaan (Ansible的首席开发人员) responded在这个话题上回答了一个类似的问题:

通常我发现剧本的目的是将主机绑定到角色,因此单个角色应该包含包列表。

我会使用角色,因为它是更干净的IMO。

如果您确实需要(但这不是推荐的方式),可以在ansible.cfg中设置hash_behaviour选项:

代码语言:javascript
复制
[defaults]
hash_behaviour = merge

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

group_vars/all/package.yml:

代码语言:javascript
复制
packages:
    all: [pkg1, pkg2]

group_vars/servers/package.yml:

代码语言:javascript
复制
packages:
    servers: [pkg3, pkg4]

不过,在攻略中循环有点复杂。

票数 7
EN

Stack Overflow用户

发布于 2014-08-23 19:09:30

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

代码语言:javascript
复制
[defaults]
hash_behaviour = merge

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

group_vars/servers/packages.yml:

代码语言:javascript
复制
packages:
 package_name1:
 package_name2:

group_vars/pc/packages.yml:

代码语言:javascript
复制
packages:
 package_name3:
 package_name4:

在攻略任务中(| default({}) -对于缺少的"package“变量情况):

代码语言:javascript
复制
- name: install host packages
  yum: name={{ item.key }} state=latest
  with_dict: packages | default({})
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23525546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档