users
Пользователи
Этот ролик Ansible управляет учетными записями пользователей и контролирует доступ к ним с помощью ключей ssh.
Он используется для развертывания одного или нескольких приложений на сервере. Поддерживает создание учетных записей для развертывания и запуска приложения, а также для системных администраторов и разработчиков.
По сути, это обертка вокруг модуля пользователя Ansible.
Типы пользователей
Роль поддерживает создание следующих типов учетных записей пользователей:
- Глобальные системные администраторы / команда операций
Эти пользователи имеют собственные логины на сервере с правами sudo. Мы добавляем их в группу wheel
или admin
, а затем разрешаем выполнять sudo без пароля.
ПриProvisioning сервера автоматически создаются учетные записи для нашей команды системных администраторов, независимо от проекта.
- Администраторы проектов / продвинутые пользователи
Эти пользователи имеют такие же права, как глобальные администраторы, но настраиваются на основе конкретного проекта или сервера, контролируются с помощью переменных группы инвентаризации. Обычно технический лидер проекта будет администратором.
- Учетная запись развертывания
Эта учетная запись используется для развертывания приложения на сервер. Она владение файлами программного обеспечения приложения и имеет права на запись в каталоги развертывания и конфигурации.
Учетные записи приложения и развертывания не имеют прав sudo, хотя мы можем создать правило в /etc/sudoers.d/
, чтобы разрешить им выполнять команды, например, перезапускать приложение с помощью systemctl
. Это обрабатывается ролью, которая устанавливает и настраивает приложение, а не этой ролью.
Например, создайте файл, например, /etc/sudoers.d/deploy-foo
:
deploy ALL=(ALL) NOPASSWD: /bin/systemctl start foo, /bin/systemctl stop foo, /bin/systemctl restart foo, /bin/systemctl status foo
- Учетная запись приложения
Приложение работает под этой учетной записью пользователя.
Эта учетная запись имеет доступ к директориям, которые ей нужны во время выполнения, например, для журналов, и имеет доступ только для чтения к своему коду и конфигурационным файлам.
- Разработчики
Разработчики могут потребовать доступа к учетной записи развертывания или приложения, чтобы посмотреть журналы и отладить их. Мы добавляем ssh ключи для разработчиков к учетным записям, позволяя им входить через ssh.
- Пользователи проектов
Эти пользователи похожи на администраторов, но не имеют прав sudo. Примером может служить учетная запись для клиента, чтобы он мог войти и выполнять запросы к базе данных, но им не нужны административные права. Вы можете предоставить им права, например, доступ к журналам приложения, добавив их в группу приложения и установив разрешения на файлы.
Конфигурация
По умолчанию эта роль ничего не делает. Вам нужно добавить переменные конфигурации, чтобы она что-то выполняла. Обычно это делается с помощью переменных группы, например, в inventory/group_vars/app_servers
, секции vars
в плейбуке или их комбинации.
Вы можете настроить разные параметры на уровне хоста или группы, чтобы, например, дать разработчикам доступ к входу в dev-среду, но не в prod.
Учетные записи приложения
Учетная запись, которая развертывает приложение. Необязательно, если не указана, учетная запись развертывания не будет создана.
users_deploy_user: deploy
users_deploy_group: deploy
Учетная запись, которая запускает приложение. Необязательно, если не указана, учетная запись приложения не будет создана.
users_app_user: foo
users_app_group: foo
Учетные записи пользователей
Переменная users_users
определяет имена учетных записей Unix и ssh ключи для пользователей.
Это список словарей с четырьмя полями:
user
: Имя учетной записи Unixname
: Имя пользователя. Необязательно, для документации.key
: файл ssh публичного ключа. Поместите их, например, в директориюfiles
вашего плейбука.github
- это идентификатор пользователя на GitHub. Роль получает ключи пользователей сhttps://github.com/{{ github }}.keys
Пример:
users_users:
- user: jake
name: "Джейк Моррисон"
github: reachfh
- user: ci
name: "CI сервер"
key: ci.pub
Списки пользователей
После определения учетных записей пользователей в users_users
необходимо настроить списки пользователей, указав идентификатор, используемый в ключе user
. По умолчанию эти списки пустые, поэтому, если вы не укажете пользователей, они не будут созданы.
Глобальные пользователи-администраторы с отдельной учетной записью Unix и правами sudo.
users_global_admin_users:
- jake
Администраторы на уровне проекта с отдельной учетной записью Unix и правами sudo.
users_admin_users:
- fred
Пользователи проекта с отдельной учетной записью Unix, но без прав sudo.
users_regular_users:
- bob
Пользователи (ssh ключи), которые могут получить доступ к учетной записи развертывания.
users_deploy_users:
- ci
Пользователи (ssh ключи), которые могут получить доступ к учетной записи приложения.
users_app_users:
- fred
Конфигурация группы
Вы можете указать дополнительные группы, которые будут иметь разные типы пользователей. По умолчанию эти списки пусты, но вы можете использовать их для тонкой настройки доступа к приложению.
Мы обычно настраиваем ssh так, чтобы учетная запись пользователя должна быть членом группы sshusers
, иначе ssh не позволит никому войти.
Добавьте это в /etc/ssh/sshd_config
AllowGroups sshusers sftpusers
Затем добавьте sshusers
в users_admin_groups
, например,
users_admin_groups:
- sshusers
Unix группы, к которым должны принадлежать администраторы.
Роль всегда добавляется в группу wheel
или admin
, в зависимости от платформы. Если определены администраторы, тогда эта роль настраивает sudo с файлом /etc/sudoers.d/00-admin
, чтобы администраторы могли выполнять sudo без пароля.
users_admin_groups:
- sshusers
Unix группы, к которым должны принадлежать обычные пользователи:
users_regular_groups:
- sshusers
Unix группы, к которым должна принадлежать учетная запись развертывания:
users_deploy_groups:
- sshusers
Unix группы, к которым должна принадлежать учетная запись приложения:
users_app_groups:
- sshusers
Удаление пользователей
Эта роль определяет пользователей, которых она создает с "ansible-" в комментарии. Это позволяет отслеживать, когда пользователи добавляются или удаляются из списков, и удалять учетные записи.
Вы также можете указать учетные записи в списке users_delete_users
, и они будут удалены. Это полезно для очистки устаревших учетных записей.
Вы можете контролировать, следует ли удалять домашний каталог пользователя при удалении учетной записи с помощью переменных users_delete_remove
и users_delete_force
. См. документацию Ansible для подробностей.
Для безопасности эти переменные по умолчанию равны no
, но если вы управляете системными пользователями с помощью этой роли, вам, вероятно, следует установить их на yes
.
users_delete_remove: yes
users_delete_force: yes
Роль может дополнительно удалить авторизованные ключи от системных пользователей, таких как 'root' или 'ubuntu'. Это полезно для безопасности, чтобы избежать резервной копии корневых ключей, как только вы настроили именованных администраторов.
users_remove_system_authorized_keys: true
Настройка
Обычная последовательность - выполнить эту роль в первую очередь на новом экземпляре.
Это создает учетные записи администраторов и настраивает их ключи, чтобы они могли запускать другие роли, которые настраивают сервер. Роль, специфичная для проекта, отвечает за подготовку сервера к приложению, например, создание каталогов и установку зависимостей. Обычно мы развертываем приложение с сервера сборки или CI, без sudo, используя учетную запись deploy
.
Вот типичный плейбук:
- name: Управление пользователями
hosts: '*'
vars:
users_app_user: foo
users_app_group: foo
users_deploy_user: deploy
users_deploy_group: deploy
users_users:
- user: jake
name: "Джейк Моррисон"
github: reachfh
users_app_users:
- jake
users_deploy_users:
- jake
roles:
- { role: cogini.users, become: true }
Добавьте хост в файл inventory/hosts
.
[web-servers]
web-server-01
Добавьте хост в .ssh/config
или проектный файл ssh.config
.
Host web-server-01
HostName 123.45.67.89
На физическом сервере, где мы начинаем с учетной записи root и без ssh ключей, нам нужно настроить сервер в первый раз, указав пароль с помощью -k.
ansible-playbook -k -u root -v -l web-server-01 playbooks/manage-users.yml --extra-vars "ansible_host=123.45.67.89"
На macOS команда -k требует утилиты askpass, которая не установлена по умолчанию, поэтому она использует параметикo, который не понимает .ssh/config
, поэтому мы указываем ansible_host
вручную.
На последующих запусках, после создания учетных записей администраторов, используйте:
ansible-playbook -u $USER -v -l web-server-01 playbooks/manage-users.yml
Удаление устаревших пользователей
Определите устаревшие учетные записи пользователей для удаления в списке users_delete_users
, например:
ansible-playbook -u $USER -v -l web-servers playbooks/manage-users.yml --extra-vars "users_delete_users=[fred] users_delete_remove=yes users_delete_force=yes"
Лицензия
MIT
Информация об авторе
Джейк Моррисон из Cogini
ansible-galaxy install cogini/ansible-role-users