Skip to content
Go back

通过调用shell模块来解决旧版本ansible无法设置密码过期时间的问题

Edit page

通过调用shell模块来解决旧版本ansible无法设置密码过期时间的问题

最近线上发现了一个问题, 这个问题的原因是由于系统用户过期导致用户无法在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对应关于账户的配置代码, 其是实现是基于ansibleuser模块完成的, 相应代码如下

- 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

参考


Edit page
Share this post on:

Previous Post
在TestContainers中实现Docker registry认证
Next Post
当调度服务接口时报错提示cannot execute UPDATE in a read-only transaction问题解决