通过调用shell模块来解决旧版本ansible无法设置密码过期时间的问题
· 3 min read
最近线上发现了一个问题, 这个问题的原因是由于系统用户过期导致用户无法在web
通过SSH/VNC
连接集群, 下面将介绍这个问题的具体细节以及解决方案.
原因
查看负责创建SSH/VNC
的服务的日志发现该服务在使用对应节点上的系统用户进行ssh
连接时报错, 错误提示Auth fail
.
登录到对应节点查看系统用户的密码过期时间, 发现密码已经过期, 导致无法使用该用户进行ssh
连接.
解决方案
修改ansible
中的fs-base.yml
相关代码如下
- name: unlock and set xxx user never expire
hosts: all
become: yes
gather_facts: no
any_errors_fatal: no
tasks:
- name: unlock and set xxx user never expire
user:
name: xxx
password: 'xxx'
update_password: always
expires: -1
- name: set max expire to 100 years
shell: chage -M 36500 xxx
排查步骤
使用云厂商提供的login user
登录到对应头节点尝试使用系统用户进行ssh连接, 发现无法连接, 报错提示密码过期
sudo ssh -i /home/xxx/.ssh/id_rsa xxx@localhost
排查deploy
对应关于账户的配置代码, 其是实现是基于ansible
的user
模块完成的, 相应代码如下
- name: unlock and set xxx user never expire
hosts: all
become: yes
gather_facts: no
any_errors_fatal: no
tasks:
- name: unlock and set xxx user never expire
user:
name: xxx
password: ''
update_password: always
expires: -1
其中expires
设置为了-1, 这个只能改变账户的过期时间而不会改变密码过期时间, 需要查看user模块的文档来查看对应的参数
在ansible的文档中提供了对应参数, 参数如下
password_expire_max | added in ansible-core 2.11 | Maximum number of days between password change. Supported on Linux only.
password_expire_min | added in ansible-core 2.11 | Minimum number of days between password change. Supported on Linux only.
由于我们的ansible
版本为2.10
, 无法使用这两个参数, 所以需要另一种方式来解决这个问题
目前最快的解决办法是新建一个task, 通过shell
模块来执行chage
命令来修改密码过期时间, 代码如下
- name: unlock and set xxx user never expire
hosts: all
become: yes
gather_facts: no
any_errors_fatal: no
tasks:
- name: unlock and set xxx user never expire
user:
name: xxx
password: 'xxx'
update_password: always
expires: -1
- name: set max expire to 100 years
shell: chage -M 36500 xxx