Назад | Перейти на главную страницу

Убедитесь, что с помощью 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 }}"

А common_adm_users выглядит так:

  - name: user1
    comment: "First Last"
    ssh_key: "ssh-rsa AAAAB3Nza..."

Это отлично работает для создания пользователей, но когда кто-то покидает команду, простое удаление его пользователя из common_adm_users не приводит к его удалению с серверов, когда мы повторно применяем роль, которая включает эту задачу.

Как лучше всего вести точный список пользователей?

Это аналогичный ответ @Konstantin Suvorov, но немного более доработанный, с некоторыми нюансами, четко прописанными, фактически протестированными и используемыми.

Используя следующее, вам нужно поддерживать только один список имен пользователей, к которым вы хотите иметь доступ. Любые добавления или удаления из этого списка будут отражены в доступе к хосту.

Необязательный полезный совет: на самом деле мы решили использовать наши имена пользователей GitHub для этого списка, так как тогда мы также можем легко добавить ключи SSH. См. Конец для примера.

Во-первых, в нашем group_vars мы определяем наш список разработчиков, к которым мы хотим иметь доступ (обратите внимание, что это можно определить разными способами, а не только group_vars):

developers:
  - user1
  - user2
  - etc...

Во-вторых, мы создаем группу, в которую мы назначим наших разработчиков:

- name: Create "developers" group
  group:
    name: developers
    state: present

В-третьих, мы добавляем в эту группу наших разработчиков. ОБРАТИТЕ ВНИМАНИЕ, что мы добавляем их через groups и нет group свойство. Это добавит их в качестве вторичной группы и гарантирует, что они появятся в /etc/group. Это очень важно, потому что, если вы добавите их в качестве основной группы, они не будут отображаться как члены этой группы в /etc/group:

- name: Add user accounts
  user:
    name: "{{ item }}"
    shell: /bin/bash
    groups: [developers]
    state: present
  with_items: "{{ developers }}"

В-четвертых, мы получаем всех пользователей, которые в настоящее время принадлежат к группе разработчиков на хосте (Обратите внимание, что это зависит от первичного / вторичного допущения, упомянутого на предыдущем этапе.):

- name: Determine existing users
  shell: 'grep developers /etc/group | cut -d: -f4 | tr "," "\n"'
  changed_when: false 
  register: existing_users

В-пятых, определите, кого из этих пользователей следует удалить (например, тех, которые не определены в нашем developers список group_vars):

- name: Determine removed users
  set_fact:
    removed_users: "{{ existing_users.stdout_lines | difference(developers) }}"

Шестое и последнее, удалите их:

- name: Delete removed user accounts
  user:
    name: "{{ item }}"
    state: absent
  with_items: "{{ removed_users }}"

Необязательный полезный шаг - при добавлении пользователей по имени пользователя GitHub вы можете легко предоставить им доступ по SSH с помощью открытого ключа, доступного на GitHub:

- name: Add public ssh keys of users
  authorized_key:
    user: "{{ item }}"
    exclusive: yes
    key: https://github.com/{{ item }}.keys
    state: present
  with_items: "{{ developers }}"

Здесь вам нужно выполнить несколько дополнительных задач.

После добавления всех необходимых пользователей захватите существующих пользователей, например:

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

и удалите устаревшие:

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

Примечание: код не тестируется, может содержать опечатки и т. Д.

Фактически вы можете просто добавить поле к существующей задаче:

- name: Create adm users
  user:
    name: "{{ item.name }}"
    group: "{{ common_adm_group }}"
    createhome: yes
    password: "!!"
    update_password: always
    state: "{{ item.state | default('present') }}"
  with_items: "{{ common_adm_users }}"

А затем сделайте так, чтобы данные об уходящих членах команды выглядели так:

- name: user1
    comment: "First Last"
    ssh_key: "ssh-rsa AAAAB3Nza..."
    state: "absent"