在 Ansible 中,ansible.builtin.user 模块用于管理用户账户,包括设置密码过期策略。然而,存在一个已知问题,即 password_expire_min 参数可能无法正确设置,导致密码过期的最小天数始终为 0。

错误复现

以下是一个会导致该问题的 Ansible Playbook 示例:

---
- name: user module demo
  hosts: all
  become: true
  vars:
    myuser: "example"
  tasks:
    - name: password expiration
      ansible.builtin.user:
        name: "{{ myuser }}"
        password_expire_min: 7
        password_expire_max: 90

执行后,虽然任务看似成功,但实际检查用户密码策略时,password_expire_min 的值仍为 0。

问题原因

该问题的根本原因是 Ansible 的 user 模块在处理 password_expire_min 参数时存在缺陷,导致无法正确应用设置。相关问题已在 Ansible 的 GitHub 仓库中报告(Issue #75017),并且有修复的拉取请求(PR #75390)。

解决方法(临时解决方案)

在问题修复之前,可以通过分步设置密码过期策略来绕过此问题。具体方法是将 password_expire_min 和 password_expire_max 分开设置:

---
- name: user module demo
  hosts: all
  become: true
  vars:
    myuser: "example"
  tasks:
    - name: password min expiration
      ansible.builtin.user:
        name: "{{ myuser }}"
        password_expire_min: 7
    - name: password max expiration
      ansible.builtin.user:
        name: "{{ myuser }}"
        password_expire_max: 90

验证修复

执行修复后的 Playbook:

$ ansible-playbook -i demo/inventory troubleshooting/userbug_workaround.yml

验证用户密码策略是否正确设置:

$ ssh devops@demo.example.com
[devops@demo ~]$ sudo su
[root@demo devops]# chage -l example
Last password change     : Nov 08, 2021
Password expires     : Feb 06, 2022
Password inactive     : never
Account expires      : never
Minimum number of days between password change  : 7
Maximum number of days between password change  : 90
Number of days of warning before password expires : 7

可以看到,password_expire_min 的值已正确设置为 7。

总结

Ansible 的 user 模块存在一个已知问题,导致 password_expire_min 参数无法正确设置。在问题修复之前,可以通过分步设置密码过期策略来绕过此问题。相关问题已在 Ansible 的 GitHub 仓库中报告,您可以关注 Issue #75017 和 PR #75390 以获取最新进展。