【问题标题】:Ansible - Avoid duplicates between group and host varsAnsible - 避免组和主机变量之间的重复
【发布时间】:2021-01-04 12:57:59
【问题描述】:

我是使用 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 }}"

group_vars/type_a.yaml :

users:
  user1:
    name: user1
  user2:
    name: user2

host_vars/vm1.yaml

users:
  user3_vm1_specific:
    name: user3_vm1_specific

最后,我需要“vm1”上的 3 个用户,而“vm2”上只有“user1”和“user2”,然后我将使用 vars 来创建用户。

使用合并选项(将在较新版本的 ansible 中弃用)有效,但似乎不是最佳做法。

我在 StackOverflow 和其他网站上搜索过这里,大多数时候的解决方案是:

  • 复制用户定义 (每个用户的属性超过 8 个且主机组过多:不可接受。)
  • 为第二个用户列表使用其他名称,然后使用{{ user_list1 + user_list2 }} 组合两者。

如果我们想添加许多嵌套组,则扩展性不强。您每次都需要添加自定义命名列表。如果“host_vars”和“group_vars”具有相同的用户定义,它也会重复:它不会合并内容,而是每次使用不同的内容声明两次。

我的第一个解决方案正在运行,但使用了一个近乎弃用的选项。 那么在这种情况下管理 vars 的最佳实践是什么? (已经阅读了关于 vars 的 ansible 文档,但它并没有真正帮助我)。

另外,也许 ansible tower 或 foreman 可以解决这个问题?

【问题讨论】:

    标签: ansible


    【解决方案1】:

    一个非常简单、易于维护且灵活的解决方案是将用户放入一个字典中。例如

    shell> cat group_vars/all/users.yml 
    users:
      groups:
        type_a:
          - user1
          - user2
        type_b:
          - user3
          - user4
      hosts:
        vm1:
          - user3_vm1_specific
        vm2:
          - user4_vm2_specific
    

    然后下面的任务提取所有组的列表,添加主机的列表,使项目唯一,并对其进行排序

    shell> cat playbook.yml
    - hosts: type_a
      tasks:
        - set_fact:
            my_users: "{{ (group_names|
                           map('extract', users.groups)|list +
                           users.hosts[inventory_hostname]|default([]))|
                           flatten|unique|sort }}"
        - debug:
            var: my_users
    

    给予

    shell> ansible-playbook playbook.yml 
    
    PLAY [type_a] ****
    
    TASK [debug] ****
    ok: [vm1] => 
      my_users:
      - user1
      - user2
      - user3_vm1_specific
    ok: [vm2] => 
      my_users:
      - user1
      - user2
      - user4_vm2_specific
    

    注意事项:

    • 此用例中的列表更简单。字典也可以,但代码会更复杂。
    • 主机可以是多个组的成员。
    • 单个字典易于维护,可能从外部数据库创建(例如Forman Manage Users)。
    • 选择列表的任务很简单,并且在管理员的控制之下。

    【讨论】:

    • 如果 vm2 没有定义用户,它会崩溃,但我想我可以为此设置 jinja2 条件。
    • 你曾经使用过工头或塔,也许他们能比使用这种 var 更好地管理库存吗?
    • 1) 我用“|default([])”更新了任务。 “vm*”不必在“users.hosts”中定义。 2) Ansible Tower 是 Ansible 的 UI,具有对剧本、用户、结果的高级管理……它不提供对变量的不同管理。见ansible-runner。 3) 这同样适用于 Forman。见Forman Ansible Modules
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    相关资源
    最近更新 更多