我是使用 ansible 进行服务器管理的新手,我需要一些帮助来根据主机和主机组管理用户和组的成员资格定义,尽量减少重复,最大限度地提高可扩展性。
(25 个用户/20 个组,超过 50 个主机,末尾有不同的“sudo”和“组成员资格”)。
想法是:
- “groups_vars”文件定义在主机组的每个主机上创建的用户(列表或哈希)。
- “host_vars” 文件定义特定主机的用户。(最后,我需要嵌套组,而不是特定的 host_vars 文件)
我需要合并这些“*_vars 文件”内容,而不是替换它们(我理解“vars 优先级”的工作原理),因为我想避免用户声明重复。
为了实现这一点,我在“*_vars”文件中使用了哈希语法,并在 /etc/ansible/ansible.cfg 中设置了“hash_behaviour=merge”。
以下是我的文件:
我的库存:
all:
children:
type_a:
hosts:
vm1:
vm2:
我的调试剧本:
- hosts: type_a
tasks:
- name: Debugging
debug:
msg: "{{ users }}"
组变量/type_a.yaml:
users:
user1:
name: user1
user2:
name: user2
主机变量/vm1.yaml
users:
user3_vm1_specific:
name: user3_vm1_specific
最后,我需要“vm1”上的 3 个用户以及“vm2”上仅需要“user1”和“user2”,然后我将使用变量来创建用户。使用合并选项(将在新版本的 ansible 中弃用)是可行的,但似乎不是最佳实践。
我在 ServFault 和其他网站上搜索过,大多数情况下解决方案是:
- 重复用户定义(每个用户的属性超过 8 个且主机组太多:不可接受。)
- 使用另一个名称作为第二个用户列表,然后使用“{{ user_list1 + user_list2 }}”组合两者。
如果我们想添加许多嵌套组,则可扩展性不强。每次都需要添加自定义命名列表。如果“host_vars”和“group_vars”具有相同的用户定义,它还会重复:它不会合并内容,但每次都会使用不同的内容声明两次。
我的第一个解决方案是可行的,但使用的是几乎弃用的选项。那么在这种情况下管理变量的最佳实践是什么?(已经阅读了有关变量的 ansible 文档,但它并没有真正帮助我)。
另外,也许 ansible tower 或 foreman 可以解决这个问题?
问候
M.
答案1
Ansible Jinja2 有一个combine()
过滤器,可用于将两个字典合并在一起。
就你的情况来说,你应该:
group_vars/type_a.yaml
group_users:
user1:
name: user1
user2:
name: user2
host_vars/vm1.yaml
host_users:
user3_vm1_specific:
name: user3_vm1_specific
调试剧本:
- hosts: type_a
tasks:
- name: Debugging
debug:
msg: "{{ group_users | combine(host_users) }}"
我认为该merge
策略已被弃用,因为它是全有或全无的,并且可能导致不良的副作用。