确保 Ansible 只存在特定的用户列表

Gio*_*oni 6 ansible

我们使用 Ansible 创建具有此任务的用户:

- name: Create adm users
  user:
    name: "{{ item.name }}"
    group: "{{ common_adm_group }}"
    createhome: yes
    password: "!!"
    update_password: always
    state: present
  with_items: "{{ common_adm_users }}"
Run Code Online (Sandbox Code Playgroud)

而 common_adm_users 是这样的:

  - name: user1
    comment: "First Last"
    ssh_key: "ssh-rsa AAAAB3Nza..."
Run Code Online (Sandbox Code Playgroud)

这适用于创建用户,但是当有人离开团队时,当我们重新应用包含此任务的角色时,仅从 common_adm_users 中删除他们的用户并不会导致它从服务器中删除。

维护准确的用户列表的最佳做法是什么?

Jam*_*mes 8

这是与@Konstantin Suvorov 类似的答案,但更精致一些,清楚地说明了一些细微差别,并经过实际测试和使用。

使用以下内容,您只需要维护一个您希望访问的用户名列表。该列表中的任何添加或删除都将反映在主机访问中。

可选的有用提示:我们实际上选择在此列表中使用我们的 GitHub 用户名,这样我们也可以轻松添加 SSH 密钥。例子见文末。

首先,在group_vars我们定义我们希望访问的开发人员列表(请注意,这可以通过多种方式定义,而不仅仅是group_vars):

developers:
  - user1
  - user2
  - etc...
Run Code Online (Sandbox Code Playgroud)

其次,我们创建一个组,我们将为其分配开发人员:

- name: Create "developers" group
  group:
    name: developers
    state: present
Run Code Online (Sandbox Code Playgroud)

第三,我们将我们的开发人员添加到这个组中。请注意,我们通过groupsand notgroup属性添加它们。这会将其添加为次要组并确保它们出现在/etc/group. 这很重要,因为如果您将它们添加为主要组,它们将不会在 中显示为该组的成员/etc/group

- name: Add user accounts
  user:
    name: "{{ item }}"
    shell: /bin/bash
    groups: [developers]
    state: present
  with_items: "{{ developers }}"
Run Code Online (Sandbox Code Playgroud)

第四,我们然后获取当前属于主机上开发者组的所有用户(请注意,这取决于上一步中提到的主要/次要假设):

- name: Determine existing users
  shell: 'grep developers /etc/group | cut -d: -f4 | tr "," "\n"'
  changed_when: false 
  register: existing_users
Run Code Online (Sandbox Code Playgroud)

第五,确定哪些用户应该被删除(例如那些没有在我们的developersgroup_vars 列表中定义的用户):

- name: Determine removed users
  set_fact:
    removed_users: "{{ existing_users.stdout_lines | difference(developers) }}"
Run Code Online (Sandbox Code Playgroud)

第六也是最后,删除它们:

- name: Delete removed user accounts
  user:
    name: "{{ item }}"
    state: absent
  with_items: "{{ removed_users }}"
Run Code Online (Sandbox Code Playgroud)

可选的有用步骤 - 如果通过 GitHub 用户名添加用户,您可以轻松地从他们在 GitHub 上可用的公钥授予他们 SSH 访问权限:

- name: Add public ssh keys of users
  authorized_key:
    user: "{{ item }}"
    exclusive: yes
    key: https://github.com/{{ item }}.keys
    state: present
  with_items: "{{ developers }}"
Run Code Online (Sandbox Code Playgroud)


Kon*_*rov 3

您需要在这里执行一些额外的任务。

添加所有必需的用户后,获取现有用户,例如:

- shell: 'grep {{ common_adm_group }} /etc/group | cut -d: -f4 | tr "," "\n"'
  changed_when: false # Make task green
  register: existing_users
Run Code Online (Sandbox Code Playgroud)

并删除陈旧的:

- user:
    name: "{{ item }}"
    state: absent
  with_items: "{{ existing_users.stdout_lines | difference(common_adm_users | map(attribute='name') | list) }}"
Run Code Online (Sandbox Code Playgroud)

注意:代码未经测试,可能包含拼写错误等。