ryandaniels.create_users

ansible-role-create-users

CI

用于管理 Linux 上用户的角色。
在用户列表配置文件中管理用户(列表存储在 vars/secret 文件中)。
添加用户(指定 uid)、更改密码、锁定/解锁用户帐户、管理 sudo 访问(按用户)、为基于 ssh 的身份验证添加 ssh 密钥、设置用户的主组和 gid、将用户添加(追加)到组中,如果组不存在则会被创建。
这基于“组”进行操作(Ansible 组变量),由配置文件中设置。组来自于在清单文件中为服务器指定的 Ansible 组。对所有主机的支持也通过 all 实现。

更多详细示例可以在博客中找到:使用 Ansible 管理用户

注意:故意不执行删除用户的操作。

测试的操作系统

  • Ubuntu 22.04, 20.04, 18.04, 16.04
  • CentOS / RHEL: 9.1, 8.x, 7.x, 6.5, 5.9

依赖

需要 Ansible 2.6(由于以前的 bug 20096 导致用户不过期)

ansible-vault

使用 ansible-vault 加密 Git 中的敏感信息。

cat vars/secret
#如果是明文则加密(在 git 提交/推送前)
ansible-vault encrypt vars/secret

#编辑加密文件:
ansible-vault edit vars/secret

vi .vaultpass
- 输入从密码管理器中获得的 Ansible Vault 密码
chmod 600 .vaultpass
vi ansible.cfg
#插入以下行
[defaults]
vault_password_file = ./.vaultpass

.gitignore

vi .gitignore
#插入以下行
.vaultpass
.retry
secret
*.secret

如何生成密码

  • 在 Ubuntu 上 - 安装 "whois" 包
mkpasswd --method=SHA-512
  • 在 RedHat 上 - 使用 Python
python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'

默认设置

---
# 注意: 'debug_enabled_default: true' 会将哈希密码输出到结果中。
debug_enabled_default: false
default_update_password: on_create
default_shell: /bin/bash
default_generate_ssh_key_comment: "{{ item.username }}@{{ ansible_hostname }}"

用户设置

文件位置:vars/secret

  • username: 用户名 - 不含空格 (必填)
  • uid: 用户 ID 的数字值(可选)
  • user_state: present|lock (必填)
  • password: sha512 加密的密码(可选)。如果未设定,密码将被设为 "!"
  • update_password: always|on_create(可选,默认安全设置为 on_create)。
    警告: 当为 'always' 时,密码将更改为指定的密码。
    如果在已有用户上使用 'always',请确保已设置密码
  • comment: 姓名和部门或应用说明(可选)(但你应该设置这项!)
  • primarygroup: 主组名称(可选)。
  • primarygid: 主组 ID(可选)。如果服务器上重复使用同样的 gid,剧本将会失败。如果指定的组有不同的 gid,会使用最后配置的值。 警告: 更改已有用户的 primarygroup 和/或 primarygid 不会更改该用户所属文件的权限。旧条目仍将保留在 /etc/group 中。请谨慎使用。
  • groups: 用户将被添加(追加)到的组的逗号分隔列表。如果组不存在,则将在特定服务器上创建此组。这不是主组(主组不被修改)。
  • shell: shell 的路径(可选,默认是 /bin/bash)
  • ssh_key: 为基于 ssh 的身份验证添加授权 ssh 密钥(可选)
    注意:1 个密钥可以在单行上,但如果多个密钥,使用下面第一个示例的格式。
  • exclusive_ssh_key: yes|no(可选,默认:no)
    警告: exclusive_ssh_key: yes - 将删除未在此处定义的任何 ssh 密钥!no - 将添加指定的任何密钥。
  • generate_ssh_key: 是否为相关用户生成 SSH 密钥。(可选,默认是 'no')
    注意:这不会覆盖现有的 SSH 密钥。
  • ssh_key_bits: 可选指定生成的 SSH 密钥位数。(可选,默认由 ssh-keygen 设置)
  • ssh_key_passphrase: 为 SSH 密钥设置密码短语。如果未提供密码短语,SSH 密钥将默认无密码短语。
  • generate_ssh_key_comment: 指定生成的 SSH 密钥的注释(可选)。如果未指定,将使用默认的 default_generate_ssh_key_comment。
  • use_sudo: yes|no(可选,默认 no)
  • use_sudo_nopass: yes|no(可选,默认 no)。yes = 无需输入密码的 sudo。
  • system: yes|no(可选,默认 no)。yes = 创建系统帐户(uid < 1000)。不适用于已有用户。
  • servers: 更改将应用的服务器子元素列表。 (必填)
    这些是来自 Ansible 清单文件的 Ansible 组。在以下示例中,webserver 将是 Ansible 清单 webserver 中的 3 台服务器 webserver1webserver2webserver3

注意: 如果你想要不同的设置,可以在不同的服务器上使用重复的用户名。请参见下面的示例,testuser102 在定义为 webserver 组的服务器上有 sudo 权限,而在 database 组中没有 sudo 权限。

示例 Ansible 清单文件

[webserver]
webserver1
webserver2
webserver3

[database]
db1
db2
db3

[monitoring]
monitor1

示例配置文件 (vars/secret)

---
users:
  - username: testuser101
    password: $6$/y5RGZnFaD3f$96xVdOAnldEtSxivDY02h.DwPTrJgGQl8/MTRRrFAwKTYbFymeKH/1Rxd3k.RQfpgebM6amLK3xAaycybdc.60
    update_password: on_create
    comment: 测试用户 100
    shell: /bin/bash
    ssh_key: |
      ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8crAHG/a9QBD4zO0ZHIjdRXy+ySKviXVCMIJ3/NMIAAzDyIsPKToUJmIApHHHF1/hBllqzBSkPEMwgFbXjyqTeVPHF8V0iq41n0kgbulJG testuser101@server1
      ssh-rsa AAAA.... testuser101@server2
    exclusive_ssh_key: yes
    use_sudo: no
    use_sudo_nopass: no
    user_state: present
    servers:
      - webserver
      - database
      - monitoring

  - username: testuser102
    password: $6$F/KXFzMa$ZIDqtYtM6sOC3UmRntVsTcy1rnsvw.6tBquOhX7Sb26jxskXpve8l6DYsQyI1FT8N5I5cL0YkzW7bLbSCMtUw1
    update_password: always
    comment: 测试用户 101
    groups: testcommon, testgroup102web
    shell: /bin/sh
    use_sudo: yes
    user_state: present
    servers:
      - webserver
      - all

  - username: testuser102
    password: $6$F/KXFzMa$ZIDqtYtM6sOC3UmRntVsTcy1rnsvw.6tBquOhX7Sb26jxskXpve8l6DYsQyI1FT8N5I5cL0YkzW7bLbSCMtUw1
    update_password: always
    comment: 测试用户 101
    groups: testcommon, testgroup102db
    shell: /bin/sh
    user_state: present
    servers:
      - database

  - username: testuser103
    password: $6$wBxBAqRmG6O$gPbg9hYShkuIe3YKMFujwiKsPKZHNFwoK4yCyTOlploljz53YSoPdCn9P5k8Qm0z062Q.8hvJ6DnnQQjwtrnS0
    user_state: present
    servers:
      - webserver

  - username: testuser104
    primarygroup: testgroup104primary
    ssh_key: ssh-rsa AAAB.... test103@server
    exclusive_ssh_key: no
    generate_ssh_key: yes
    generate_ssh_key_comment: 为生成的 ssh 密钥设置自定义注释
    use_sudo: no
    user_state: present
    servers:
      - webserver
      - monitoring

  - username: testuser105
    uid: 1099
    password: $6$XEnyI5UYSw$Rlc6tXtECtqdJ3uFitrbBlec1/8Fx2obfgFST419ntJqaX8sfPQ9xR7vj7dGhQsfX8zcSX3tumzR7/vwlIH6p/
    primarygroup: testgroup105primary
    primarygid: 2222
    ssh_key: ssh-rsa AAAB.... test107@server
    generate_ssh_key: yes
    ssh_key_bits: 4096
    use_sudo: no
    user_state: lock
    servers:
      - webserver
      - database

示例剧本 create-users.yml

---
- hosts: '{{inventory}}'
  vars_files:
    - vars/secret
  become: yes
  roles:
  - create-users

准备工作

  • 安装 ansible
  • 创建密钥
  • ssh 到客户端以将条目添加到 known_hosts 文件
  • 配置客户端服务器的 authorized_keys
  • 运行 ansible 命令

使用

创建所有用户

ansible-playbook create-users.yml --ask-vault-pass --extra-vars "inventory=all-dev" -i hosts
关于项目

Role to manage users on linux

安装
ansible-galaxy install ryandaniels.create_users
许可证
mit
下载
187.6k
拥有者
Ansible all the things