Ansible教程:Ad-hoc 命令用法-user模块详解 作者:马育民 • 2026-09-23 09:37 • 阅读:10001 # 介绍 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` ```bash 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 ``` 创建用户并指定附属组: ```bash ansible all -m user -a "name=app groups=nginx home=/home/app" -i ansible_client.ini -b ``` ### 3. 创建不能登录的系统账号 不能登录,常用于程序、日志、中间件运行的账号(nginx、tomcat、appuser)。 ```bash 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. 删除用户,**保留家目录** ```bash ansible all -m user -a "name=test state=absent" -i ansible_client.ini -b ``` ### 6. 删除用户,同时删除家目录和邮件 要加上 `remove=yes` ```bash ansible all -m user -a "name=test3 state=absent remove=yes" -i ansible_client.ini -b ``` 可能会报下面错误,是因为上面创建用户太多,导致目录权限混乱,所以删除失败: [](https://www.malaoshi.top/upload/0/3/1GW46Eh0NLdU.png) 解决:登录被控制机,删除 `/home/test3` 目录,重新创建用户、删除用户即可 ### 7. 修改用户信息(修改注释、shell) `state=present` 时,如果用户已存在,会更新属性,不会重建 ```bash ansible all -m user -a "name=test comment='new comment' shell=/bin/sh" -i ansible_client.ini -b ``` # 查看结果 查看远程主机用户信息 ```bash 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 ``` # 常见坑点 1. **明文密码无效**:`password=123456` 不会生效,必须加密hash 2. `remove=yes` 危险:删除用户同时清空家目录数据 3. `system=yes`:系统用户,不会自动创建家目录(create_home默认no) 4. 组不存在时报错:`groups`参数里的附属组必须提前存在,user模块不会新建组(新建组用`group`模块) 5. Ad-hoc是一次性执行,**不幂等的操作不要用**;复杂逻辑优先playbook 原文出处:/show_1GW46EkWPsff.html