在 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 以获取最新进展。