cogini.users

用户

这个 Ansible 角色管理用户帐户,并通过 SSH 密钥控制对它们的访问。

它用于将一个或多个应用程序部署到服务器。它支持创建用于部署和运行应用程序的帐户,以及系统管理员和开发人员的帐户。

它基本上是对 Ansible 用户模块 的一种意见化封装。

用户类型

该角色支持创建以下类型的用户帐户:

  • 全局系统管理员 / 运维团队

这些用户在服务器上拥有自己的登录名,并具有 sudo 权限。我们将他们添加到 wheeladmin 组,然后允许他们无密码运行 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 组。

该角色将始终将用户添加到 wheeladmin 组中,这取决于平台。如果定义了管理员用户,则该角色将设置 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_removeusers_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

关于项目

Manage user accounts and control access to them with ssh keys

安装
ansible-galaxy install cogini.users
许可证
mit
下载
355
拥有者
Product development services for ambitious innovators