Мы используем 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"