ryandaniels.create_users
ansible-role-create-users
用于管理 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 台服务器webserver1
、webserver2
和webserver3
。
注意:
如果你想要不同的设置,可以在不同的服务器上使用重复的用户名。请参见下面的示例,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