cogini.users
用户
这个 Ansible 角色管理用户帐户,并通过 SSH 密钥控制对它们的访问。
它用于将一个或多个应用程序部署到服务器。它支持创建用于部署和运行应用程序的帐户,以及系统管理员和开发人员的帐户。
它基本上是对 Ansible 用户模块 的一种意见化封装。
用户类型
该角色支持创建以下类型的用户帐户:
- 全局系统管理员 / 运维团队
这些用户在服务器上拥有自己的登录名,并具有 sudo 权限。我们将他们添加到 wheel
或 admin
组,然后允许他们无密码运行 sudo。
当我们配置服务器时,我们会自动为我们的系统管理团队创建帐户,与项目无关。
- 项目管理员 / 权限用户
这些用户与全局管理员享有相同的权限,但是在每个项目或每台服务器的基础上设置,使用清单主机/组变量进行控制。通常项目的技术负责人会是管理员。
- 部署帐户
此用户帐户用于将应用程序部署到服务器。它拥有应用程序软件文件,并具有对部署和配置目录的写入权限。
应用程序和部署帐户没有 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
部分,或二者的组合。
您可以在主机或组级别拥有不同的设置,例如在开发环境中允许开发人员登录,而在生产环境中则不允许。
应用帐户
部署应用的帐户。 可选,如果不指定,将不会创建部署用户。
users_deploy_user: deploy
users_deploy_group: deploy
运行应用的帐户。 可选,如果不指定,将不会创建应用用户。
users_app_user: foo
users_app_group: foo
用户帐户
users_users
定义 Unix 帐户名和用户的 SSH 密钥。
它是一个字典列表,包含四个字段:
user
: Unix 帐户的名称name
: 用户的名称。可选,用于文档。key
: SSH 公钥文件。将它们放在您的剧本files
目录中,例如。github
是用户的 GitHub ID。该角色从https://github.com/{{ github }}.keys
获取用户密钥。
示例:
users_users:
- user: jake
name: "Jake Morrison"
github: reachfh
- user: ci
name: "CI server"
key: ci.pub
用户列表
在 users_users
中定义用户帐户后,配置用户列表,指定在 user
键中使用的 ID。默认情况下,这些列表是空的,因此如果您不指定用户,它们将不会被创建。
具有单独 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')中移除授权密钥。这对于安全性非常有用,以避免备份 root 密钥,一旦您设置了命名的管理员用户。
users_remove_system_authorized_keys: true
安装
正常的顺序是在新实例上首先运行此角色。
这将创建管理员用户并设置他们的密钥,以便他们可以运行其他配置服务器的角色。特定于项目的角色负责为应用程序准备服务器,例如创建目录和安装依赖项。我们通常使用 deploy
用户帐户从构建或 CI 服务器部署应用程序,无需 sudo。
以下是一个典型的剧本:
- name: 管理用户
hosts: '*'
vars:
users_app_user: foo
users_app_group: foo
users_deploy_user: deploy
users_deploy_group: deploy
users_users:
- user: jake
name: "Jake Morrison"
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
在首次启动一个没有 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 工具,而该工具在默认情况下未安装,因此它回落到 paramiko,paramiko 不理解 .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
作者信息
Jake Morrison,来自 Cogini