Ansible教程:Ad-hoc 命令用法-user模块详解

介绍

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

常见坑点

  1. 明文密码无效:password=123456 不会生效,必须加密hash
  2. remove=yes 危险:删除用户同时清空家目录数据
  3. system=yes:系统用户,不会自动创建家目录(create_home默认no)
  4. 组不存在时报错:groups参数里的附属组必须提前存在,user模块不会新建组(新建组用group模块)
  5. Ad-hoc是一次性执行,不幂等的操作不要用;复杂逻辑优先playbook

原文出处:/show_1GW46EkWPsff.html