【问题标题】:Ansible for user management -removing dead accountsAnsible 用于用户管理 - 删除死帐户
【发布时间】:2016-09-23 07:59:27
【问题描述】:

如何在 Ansible 中高效管理用户帐户? 我想将用户帐户和证书保留在列表中。

在运行 playbook 时,我想从列表中创建每个帐户(这很容易)。 我还想删除主机上存在但列表中不存在的帐户。

现在,我想出了列出现有帐户 awk -F: '($3 >= 1000) {printf "%s\n",$1}' /etc/passwd

并将其与我的列表进行比较 - 删除不需要的帐户。

有没有更简单的方法-模块可以开箱即用?

【问题讨论】:

  • 我有一个想法:在本地事实 (docs.ansible.com/ansible/…) 中使用您的 sn-p,以便可以从 playbook 以数组的形式访问每个服务器上的用户。

标签: ansible user-management


【解决方案1】:

解析/etc/passwd时搜索user-id > 1000并将nobody添加到有效用户列表中。这样您就不会删除任何系统用户。

vars:
  myusers: ['nobody', 'obama', 'trump', 'clinton', 'you', 'me']

tasks:
- shell: "getent passwd | awk -F: '$3 > 1000 {print $1}'"
  register: users

- user: name={{item}} state=absent remove=yes
  with_items: users.stdout_lines
  when: item not in myusers

记得将nobody 添加到您的有效用户列表中。

【讨论】:

  • 不幸的是,getent passwd 没有列出远程用户,例如来自sssd
  • 嗯,你不会从茶壶里拿出咖啡。
  • 在使用 NFS 而不是 nobody 的 Centos 7 上,您将拥有 nfsnobody 用户。
  • 为什么要在此处列出远程用户,@yktoo?我认为您应该以特定于源的方式将它们从源中删除,例如 LDAP。
【解决方案2】:

警告 注意只有在您完全确定要删除的用户时才这样做。如果您删除像 root 这样的系统用户,这可能会使您的系统无法使用。

几行 Ansible 就可以满足您的要求。利用 user 模块。

  vars:
    myusers: ['root', 'bin', 'mail', 'obama', 'trump', 'clinton', 'you', 'me']

  tasks:
  - shell: 'cut -d: -f1 /etc/passwd'
    register: users
  - user: name={{item}} state=absent remove=yes
    with_items: users.stdout_lines
    when: item not in myusers

【讨论】:

  • 你需要非常小心以这种方式做事。您需要指定所有系统用户,否则它将删除它们。
  • @smiller171 你是对的。如果使用不当,会导致机器无用。
  • 我使用的解决方案是让您指定要删除的用户,而不是删除不在列表中的所有内容。
  • 还只是建议了一个编辑,这样您的示例就不会将任何内容标记为已更改,除非它已更改某些内容。
  • 对于更新版本的 Ansible,您可以使用 loop。话虽如此,如果不存在任何项目(例如,如果您尝试将此代码扩展到组),则此代码将失败,“dict object”没有属性“stdout_lines”。
【解决方案3】:

尝试使用我写的这个 Ansible 角色:https://galaxy.ansible.com/smiller171/manage_users

【讨论】:

  • URL 指向 404。
  • 看起来我的用户名最终改变了,破坏了我编辑答案的 URL
猜你喜欢
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
相关资源
最近更新 更多