介绍
user模块:远程主机 管理系统用户账号(增删改用户、密码、uid/gid、家目录、shell等)
常用参数
| 参数 | 说明 |
|---|---|
name |
必填,用户名 |
state |
present(默认,创建/更新) / absent(删除用户) |
uid |
指定UID |
gid |
指定主组GID/组名 |
groups |
附加附属组,多个逗号分隔 |
shell |
登录shell,/sbin/nologin禁止登录 |
home |
指定家目录路径 |
create_home |
yes/no,是否创建家目录,默认yes |
password |
用户密码,必须是加密后的hash值,不能写明文 |
comment |
用户注释信息 |
remove |
state=absent时生效;yes 删除家目录+邮箱,no仅删账号 |
system |
yes 创建系统用户(uid一般 <1000) |
重点:password不能直接填明文!Linux shadow存放的是加密哈希。
例子
1. 创建普通用户test
不设置密码,不能登录,常用于程序、日志、中间件运行的账号(nginx、tomcat、appuser)
默认state=present
ansible all -m user -a "name=test2 comment='test2 user' shell=/bin/bash" -i ansible_client.ini -b
2. 创建用户,指定附加附属组
远程创建 nginx 组:
ansible all -m group -a "name=nginx" -i ansible_client.ini -b
创建用户并指定附属组:
ansible all -m user -a "name=app groups=nginx home=/home/app" -i ansible_client.ini -b
3. 创建不能登录的系统账号
不能登录,常用于程序、日志、中间件运行的账号(nginx、tomcat、appuser)。
ansible all -m user -a "name=nginx system=yes shell=/sbin/nologin create_home=no" -i ansible_client.ini -b
4. 创建用户并设置密码(填入加密hash串)
生成密码,使用 sha512 加密,加盐 abc123,执行下面命令:
ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'abc123') }}"
执行结果如下,$6$abc123$xU4OHDtQq7xP/CBbzZtFw2iKTGGPy0QF/SAmAtmqgC/WzxZ/oDo/VmpFB2Xw1Q7QiBLyODyF6YI3z3ySNWWT0. 就是加密后的密码:
```localhost | SUCCESS => {
“msg”: “$6$abc123$xU4OHDtQq7xP/CBbzZtFw2iKTGGPy0QF/SAmAtmqgC/WzxZ/oDo/VmpFB2Xw1Q7QiBLyODyF6YI3z3ySNWWT0.”
}
创建用户并设置密码
```bash
ansible all -m user -a 'name=test3 password="$6$abc123$xU4OHDtQq7xP/CBbzZtFw2iKTGGPy0QF/SAmAtmqgC/WzxZ/oDo/VmpFB2Xw1Q7QiBLyODyF6YI3z3ySNWWT0."' -i ansible_client.ini -b
验证
登录被控制机,切换 test 用户,执行下面命令:
su test
输入 test 用户的命令,可以正常切换
5. 删除用户,保留家目录
ansible all -m user -a "name=test state=absent" -i ansible_client.ini -b
6. 删除用户,同时删除家目录和邮件
要加上 remove=yes
ansible all -m user -a "name=test3 state=absent remove=yes" -i ansible_client.ini -b
可能会报下面错误,是因为上面创建用户太多,导致目录权限混乱,所以删除失败:
解决:登录被控制机,删除 /home/test3 目录,重新创建用户、删除用户即可
7. 修改用户信息(修改注释、shell)
state=present 时,如果用户已存在,会更新属性,不会重建
ansible all -m user -a "name=test comment='new comment' shell=/bin/sh" -i ansible_client.ini -b
查看结果
查看远程主机用户信息
ansible all -m command -a "id test" -b -i ansible_client.ini -b
ansible all -m command -a "cat /etc/passwd | grep test" -b -i ansible_client.ini -b
常见坑点
- 明文密码无效:
password=123456不会生效,必须加密hash remove=yes危险:删除用户同时清空家目录数据system=yes:系统用户,不会自动创建家目录(create_home默认no)- 组不存在时报错:
groups参数里的附属组必须提前存在,user模块不会新建组(新建组用group模块) - Ad-hoc是一次性执行,不幂等的操作不要用;复杂逻辑优先playbook
