跳到主要内容

ansible模块-用户和组模块

ansible查看帮助方法

# 查看所有模块帮助信息
ansible-doc -l

# 指定查看某个模块参数用法
ansible-doc copy

1.user用户模块

ansible all -m user -a "name=hehe uid=888 group=888 shell=/sbin/nologin create_home=no"

user模块参数

参数说明
name指定要创建的用户名称
uid指定用户uid
create_home是否创建用户家目录
create_homestate
groupstate
groups用于指定用户所在的附加组。注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合 append 参数使用,否则在默认情况下,当再次使用 groups 参数设置附加组时,用户原来的附加组会被覆盖。
append如果用户原本就存在多个附加组,那么当使用 groups 参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合 append 参数,将 append 设置为 yes,表示追加附加组到现有的附加组设置,append 默认值为 no
shell指定用户登陆shell
expires此参数用于指定用户的过期时间,相当于设置 /etc/shadow 文件中的的第8列,比如,你想要设置用户的过期日期为2018年12月31日,那么你首先要获取到2018年12月31日的 unix 时间戳,使用命令 "date -d 2018-12-31 +%s" 获取到的时间戳为1546185600,所以,当设置 expires=1546185600 时,表示用户的过期时间为2018年12月31日0点0分,设置成功后,查看远程主机的 /etc/shadow 文件,对应用户的第8八列的值将变成17895(表示1970年1月1日到2018年12月31日的天数,unix 时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在 Linux 和 FreeBSD 系统中使用
password指定用户的密码,此密码为哈希加密后的密码
generate_ssh_key此参数默认值为 no,如果设置为 yes,表示为对应的用户生成 ssh 密钥对,默认在用户家目录的 ./ssh 目录中生成名为 id_rsa 的私钥和名为 id_rsa.pub 的公钥,如果同名的密钥已经存在与对应的目录中,原同名密钥并不会被覆盖(不做任何操作)
ssh_key_file当 generate_ssh_key 参数的值为 yes 时,使用此参数自定义生成 ssh 私钥的路径和名称,对应公钥会在同路径下生成,公钥名以私钥名开头,以".pub"结尾
ssh_key_comment当 generate_ssh_key 参数的值为 yes 时,在创建证书时,使用此参数设置公钥中的注释信息。但是如果同名的密钥对已经存在,则并不会修改原来的注释信息,即不做任何操作。当不指定此参数时,默认的注释信息为"ansible-generated on 远程主机的主机名"
ssh_key_passphrase当 generate_ssh_key 参数的值为 yes 时,在创建证书时,使用此参数设置私钥的密码。但是如果同名的密钥对已经存在,则并不会修改原来的密码,即不做任何操作
ssh_key_type当 generate_ssh_key 参数的值为 yes 时,在创建证书时,使用此参数设置密钥对的类型。默认密钥类型为 rsa,但是如果同名的密钥对已经存在,并不会对同名密钥做任何操作
remove当 state 的值设置为 absent 时,表示要删除远程主机中的用户。但是在删除用户时,不会删除用户的家目录等信息,这是因为 remove 参数的默认值为 no,如果设置为yes,在删除用户的同时,会删除用户的家目录。当 state=absent 并且 remove=yes 时,相当于执行 "userdel --remove" 命令
statepresent:默认为present,创建用户
absent:删除用户

使用示例

ad-hoc

在命令行中不能使用明文密码,执行后虽然会提示 CHANGED ,但是实际上是不生效的

$ ansible all -m user -a 'name=root password=123'
[WARNING]: The input password appears not to have been hashed. The 'password' argument must be encrypted for this module to work properly.

使用如下方法

参考链接

# 先在命令行中指定一个变量
password='1'

# 然后再执行即可
ansible 10.0.0.25 -m user -a "name=root update_password=always password=\"{{ \"$password\" | password_hash('sha512') }}\""

playbook

修改多个用户

cat > change_users_pwd.yml << EOF
- hosts: test
gather_facts: false
tasks:
- name: change users password
user:
name: "{{ item.name }}"
password: "{{ item.chpass | password_hash('sha512') }}"
update_password: always
with_items:
- { name: 'root', chpass: '123'}
- { name: 'test', chpass: '456'}
EOF
ansible-playbook change_users_pwd.yml 

修改单个用户

cat > change_user_pwd.yml << EOF
- hosts: test
gather_facts: false
tasks:
- name: change user password
user:
name: "{{ name1 }}"
password: "{{ chpass | password_hash('sha512') }}"
update_password: always
EOF

使用 -e 参数传递变量到playbook中

ansible-playbook change_user_pwd.yml -e "name1=root chpass=123"

2.group组模块

ansible all -m group -a "name=hehe gid=888"

group模块参数

参数说明
name要创建的组名称
gid指定组gid
statepresent:默认为present,创建组
absent:删除组