目前使用 Ansible 进行用户管理的现状如何?

目前使用 Ansible 进行用户管理的现状如何?

我已经使用 Ansible 大约 3 年了,取得了巨大的成功,用于管理不断增长的 Linux 系统群。在深入探讨我的问题之前,我需要先介绍一些背景。

作为我日常工作的一部分,我为多家公司进行系统设计、部署和维护,这些公司都在一家风险投资公司/孵化器公司的保护下运营。我们的投资组合公司之间存在大量交叉影响,因此,我们不能说只有用户 A、B 和 C 需要访问公司 X 的系统。他们可能还需要访问公司 Y 的系统。由于每家公司的 ansible 环境都位于不同的 git 存储库中,因此情况变得复杂。这意味着存在一个很多部署用户到不同公司系统的代码重复。我最终复制/粘贴了如下代码块,以便将用户部署到某个公司的系统:

- name: add several users
  user: >
    name={{ item.name }}
    state=present
    groups={{ item.groups }}
    uid={{ item.uid }}
    password={{ item.password }}
    shell=/bin/bash
  with_items:
    - { name: 'user1', groups: 'ssh-access,sudo', uid: '501', password: '<redacted>' }
    - { name: 'user2', groups: 'ssh-access,sudo', uid: '502', password: '<redacted>' }
  tags: users

- name: authorized_keys - user1 
  action: authorized_key user=user1 key="{{ lookup('file', 'pubkeys/user1') }}" manage_dir=yes
  tags:
    - pubkeys
    - users

- name: authorized_keys - user2 
  action: authorized_key user=user2 key="{{ lookup('file', 'pubkeys/user2') }}" manage_dir=yes
  tags:
    - pubkeys
    - users

当我需要管理的用户不到 5 个时,这种方法还可以,但随着用户群的增长,通过密钥轮换、新密码等方式保持最新状态变得越来越繁重。

了解了背景和情况后,我来回答一下我的问题:

假设使用集中式身份验证系统(LDAP 等)不是一种选择,我该如何着手创建各种 ansible playbook 可以使用的集中式用户数据库?我希望能够维护一个用户、uid、密码哈希和公钥的集中列表,然后能够将用户(具有自定义的每个主机组成员身份)部署到每个公司的主机。

我正在设想某种游戏结构,例如:

- name: Deploy users
  user_management:
    - { name: "user1", groups: "sudo" }
    - { name: "user1", groups: "sudo" }

...每个用户的 uid、hash 和公钥将从中央列表中提取并照常部署。

那么,我有什么选择?我已经考虑了好一阵子了,但还是没能想出比现在更好的办法。我可以用自定义事实文件来保存我的用户数据库吗?

答案1

您需要分离您的剧本和数据。

我有一个包含所有角色、事实等的单一存储库,这些存储库可部署到各种客户系统。我确保所有角色均可重复使用且不含数据。host_vars/fqdn.ymlgroup_vars/customer_name.yml定义了该客户或远程系统独有的数据。

我的大多数角色都会根据需要随着时间的推移而扩展,而不是做from roles/foo/main.yml我所拥有的一切roles/foo/debian-foo.yml,而且roles/foo/openbsd-foo.yml只有在操作系统或其他条件匹配时才会包括在内。

简化一下,roles/adduser/main.yml可以包括这个:

- user: name={{ item.name }} ...
  with_items:
  - customer_users

group_vars/ACME.yml可以包括以下内容:

customer_users:
- name: sausage
   uid: 32153
- name: beans
   uid: 1024

在您的情况下,只要角色文件夹是所有客户中相同的共享子模块,在每个 git repo 中拥有单独的 ansible 环境可能是可以的。

相关内容