Ansible - 避免组和主机变量之间的重复

Ansible - 避免组和主机变量之间的重复

我是使用 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策略已被弃用,因为它是全有或全无的,并且可能导致不良的副作用。

相关内容