linux主机增加账号,其实是很简单的,useradd命令即可,但如果需要批量增加账号,那么就需要一台台登录,这会花费较大精力。当然,你也可以自己使用python、go等新增账号。最简单的就是使用ansible来创建账号了。
新增账号ansible all -i inventoryi -m user -a "name=test1 state=present" --become
默认使用admin账号登录,而新增账号需要使用root,如果上述不增加--become选项,就会报错
txdocker | FAILED! => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "msg": "useradd: Permission denied.\nuseradd: cannot lock /etc/passwd; try again later.\n", "name": "test", "rc": 1}
当然,如果账号是存在的,不加--become也不会报任何错,因为查看账号是有权限的。
可以使用tail -1 /etc/passwd这样的命令去查看增加的用户
使用uid=,可以指定UID
检查结果如图:
删除账号,只要把state=absent即可
检查结果如图:
但是上述并不会删除$HOME目录,见下图:
如果需要删除$HOME目录,那么就要使用remove=yes
ansible all -i inventoryi -m user -a "name=test state=absent remove=yes" -b
核查结果
ansible all -i inventoryi -m shell -a 'ls -l /home' -b
不过需要注意的是,如果先使用state=absent,下一条命令再用remove,目录是不会删除的。----这个还需要进一步确认
(myenv) ➜ 163 git:(master) ✗ a=$(python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))')(myenv) ➜ 163 git:(master) ✗ ansible all -i inventoryi -m user -a "name=test1 remove=yes uid=10000 password="$a" update_password=always" -btxdocker | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "comment": "", "create_home": true, "group": 10000, "home": "/home/test1", "name": "test1", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "stderr": "useradd: warning: the home directory already exists.\nNot copying any file from skel directory into it.\nCreating mailbox file: File exists\n", "stderr_lines": [ "useradd: warning: the home directory already exists.", "Not copying any file from skel directory into it.", "Creating mailbox file: File exists" ], "system": false, "uid": 10000}tx | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "comment": "", "create_home": true, "group": 10000, "home": "/home/test1", "name": "test1", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "stderr": "useradd: warning: the home directory already exists.\nNot copying any file from skel directory into it.\nCreating mailbox file: File exists\n", "stderr_lines": [ "useradd: warning: the home directory already exists.", "Not copying any file from skel directory into it.", "Creating mailbox file: File exists" ], "system": false, "uid": 10000}
测试可以登录
(myenv) ➜ 163 git:(master) ✗ ansible all -i inventoryi -m user -a "name=test1 state=absent remove=yes uid=10000 password="$a" update_password=always" -btxdocker | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "force": false, "name": "test1", "remove": true, "state": "absent"}tx | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "force": false, "name": "test1", "remove": true, "state": "absent"}(myenv) ➜ 163 git:(master) ✗ ansible all -i inventoryi -m shell -a 'ls -l /home' -btxdocker | CHANGED | rc=0 >>total 8drwx------ 10 admin admin 4096 Jul 12 16:40 admindrwx------ 6 lighthouse lighthouse 4096 Apr 4 21:24 lighthousetx | CHANGED | rc=0 >>total 28drwx------ 15 admin admin 4096 Apr 13 17:47 admindrwxr-xr-x 4 root root 4096 Mar 15 11:57 jpomdrwxr-xr-x 5 root root 4096 Mar 15 14:40 jpom-serverdrwx------ 3 lighthouse lighthouse 4096 May 14 2022 lighthousedrwxr-xr-x 3 root root 4096 Mar 8 16:57 server-rw-r--r-- 1 root root 2908 Mar 15 10:30 wget-logdrwx------ 7 zbjavakf zbjavakf 4096 Apr 24 15:42 zbjavakf(myenv) ➜ 163 git:(master) ✗
其它的就不一一尝试了,功能很丰富。
-m:要执行的模块,默认为command-a:指定模块的参数-u:ssh连接的用户名,默认用root,ansible.cfg中可以配置-b,--become:变成那个用户身份,不提示密码-k:提示输入ssh登录密码,当使用密码验证的时候用-s:sudo运行-U:sudo到哪个用户,默认为root-K:提示输入sudo密码,当不是NOPASSWD模式时使用-C:只是测试一下会改变什么内容,不会真正去执行-c:连接类型(default=smart)-f:fork多少进程并发处理,默认为5个-i:指定hosts文件路径,默认default=/etc/ansible/hosts-I:指定pattern,对已匹配的主机中再过滤一次-list-host:只打印有哪些主机会执行这个命令,不会实际执行-M:要执行的模块路径,默认为/usr/share/ansible-o:压缩输出,摘要输出--private-key:私钥路径-T:ssh连接超时时间,默认是10秒-t:日志输出到该目录,日志文件名以主机命名-v:显示详细日志ansible中user模块的参数说明name: 用于指定操作的 user,必须项。uid: 用于指定 user 的 UID,默认为空。non_unique: 与uid参数一起使用,允许改变UID为非唯一值。group: 参数用于指定用户 主组。默认值为空,为空时创建的用户组名跟用户名一致。groups: 参数用于指定用户属组,可以在创建用户时指定用户属组,也可以管理已经存在的用户属组。append: 跟groups参数一起使用管理用户属组,默认为false,如果 append='yes' ,则从groups参数中增加用户的属组;如果 append='no' ,则用户属组只设置为groups中的组,移除其他所有属组。state: 参数用于指定用户是否存在于远程主机中。可选值有 present、absent,默认值为 present。
默认值为 present,表示用户存在,相当于在远程主机创建用户;当设置为 absent 时表示用户不存在,相当于在远程主机删除用户。
remove: 参数在 state=absent 时使用,等价于 userdel --remove 布尔类型,默认值为 false。force: 参数在 state=absent 时使用,等价于 userdel --force,布尔类型,默认值为 false。home: 参数用于指定用户home目录,值为路径create_home: 在用户创建时或home目录不存在时为用户创建home目录,布尔类型,默认值为 truemove_home: 如果设置为yes,结合home= 使用,临时迁移用户家目录到特定目录comment: 参数用于指定用户注释信息shell: 参数用于指定用户默认shellsystem: 参数用于指定用户是否是系统用户expires: 参数用于指定用户过期时间,相当于设置 /etc/shadow 文件中的的 第8列passwd: 参数用于指定用户密码,但是这个密码不能是明文密码,而是一个对明文密码加密后的字符串,默认为空相当于 /etc/shadow 文件中的密码字段,是一个对明文密码进行哈希后的字符串,可以使用命令生成明文密码对应的加密字符串
openssl passwd -1 '123456'
openssl passwd -1 -salt 'abcdefg' '123456'
password_lock: 参数用于锁定指定用户,布尔类型,默认为空update_password: 参数可选值有always 和 on_create,默认为always 。当设置为always时,password参数的值与 /etc/shadow 中密码字符串不一致时更新用户的密码;当设置为on_create时,password参数的值与 /etc/shadow 中密码字符串不一致时也不会更新用户的密码,但如果是新创建的用户,则此参数即使为on_create,也会更新用户密码。generate_ssh_key: 参数用于指定是否生成ssh密钥对,布尔类型,默认为false。当设置为yes时,为用户生成 ssh 密钥对,默认在 ~/.ssh 目录中生成名为 id_rsa私钥 和 id_rsa公钥,如果同名密钥已经存在,则不做任何操作。sssh_key_bits: 当 generate_ssh_key=yes 时,指定生成的ssh key加密位数。ssh_key_file: 当 generate_ssh_key=yes 时,使用此参数指定ssh私钥的路径及名称,会在同路径下生成以私钥名开头以 结尾对应公钥。ssh_key_comment: 当 generate_ssh_key=yes 时,在创建证书时,使用此参数设置公钥中的注释信息。如果同名密钥已经存在,则不做任何操作。当不指定此参数时,默认注释信息为"ansible-generated on $hostname”。ssh_key_passphrase: 当 generate_ssh_key=yes 时,在创建证书时,使用此参数设置私钥密码。如果同名密钥已经存在,则不做任何操作。ssh_key_type: 当 generate_ssh_key=yes 时,在创建证书时,使用此参数指定密钥对的类型。默认值为 rsa,如果同名密钥已经存在,则不做任何操作。