使用Ansible进行用户管理的最新技术是什么?


10

我已经使用Ansible取得了巨大的成功,已经有3年了,用于管理数量不断增长的linux系统。在深入探讨我的问题之前,我需要设置一些背景。

作为日常工作的一部分,我为所有在一家风险投资/孵化器公司的保护下运营的公司进行系统设计,部署和维护。我们的投资组合公司之间存在很多异花授粉,因此,我们不能说只有用户A,B和C才需要访问X公司的系统。他们可能还需要访问Y公司的系统。每个公司的环境都位于不同的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剧本可能消耗的集中式用户数据库?我希望能够维护一个用户,uid,密码哈希和公共密钥的中央列表,然后能够将用户(具有自定义的按主机组成员身份)部署到每个公司的主机。

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

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

...将每个用户的uid,哈希和公钥从中央列表中拉出并像往常一样部署。

那么,我有什么选择?我已经考虑了很长时间了,没有比我已经做的更好的事情了。我可以使用自定义事实文件来保存用户数据库吗?

Answers:


8

您需要将您的剧本和数据分开。

我只有一个仓库,其中包含我的所有角色,事实等,可以部署到广泛的客户系统中。我确保所有角色都可恢复并且没有数据。在host_vars/fqdn.ymlgroup_vars/customer_name.yml我中定义该客户或远程系统唯一的数据。

我的大部分角色都需要随着时间的推移扩大,而不是做的一切from roles/foo/main.yml我都roles/foo/debian-foo.ymlroles/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

就您而言,只要Roles文件夹是一个在所有客户中都相同的共享子模块,则可以在每个git repo中拥有独立的ansible环境。


这为我指明了正确的方向。谢谢亚历克斯!我仍然需要理清如何维护一个用户名/键/ uids / etc的单一数据库,我可以从各个角色和/或组中进行引用,但是我认为我对如何实现这一点有一些想法。
EEAA

1
@EEAA记住角色/全部可以是包含文件的目录,因此您可以轻松地集中角色/全部/staff.yml,角色/全部/foo.yml等
Alex Holst
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.