在 Ansible 中,尝试解锁一个已锁定密码的用户时,可能会遇到“usermod: unlocking the user’s password would result in a passwordless account”错误。这是因为解锁密码时没有设置新密码,导致用户账户没有密码。
错误复现
以下是一个会导致该错误的 Ansible Playbook 示例:
---
- name: user module demo
hosts: all
become: true
vars:
myuser: "example"
tasks:
- name: create a disabled user
ansible.builtin.user:
name: "{{ myuser }}"
state: present
password_lock: true
- name: enable user
ansible.builtin.user:
name: "{{ myuser }}"
state: present
password_lock: false
运行 Playbook 后,会报错提示无法解锁密码,因为这会导致用户没有密码。
解决方法
要解决此问题,需要在解锁密码时设置一个新密码。可以使用 password 参数并结合 password_hash 过滤器来设置密码。
修复后的 Playbook 如下:
---
- name: user module demo
hosts: all
become: true
vars:
myuser: "example"
mypassword: "password"
tasks:
- name: create a disabled user
ansible.builtin.user:
name: "{{ myuser }}"
state: present
password_lock: true
- name: enable user
ansible.builtin.user:
name: "{{ myuser }}"
password: "{{ mypassword | password_hash('sha512') }}"
state: present
password_lock: false
修复验证
运行修复后的 Playbook:
$ ansible-playbook -i demo/inventory troubleshooting/passwordless_fix.yml
如果成功,您将看到类似以下的输出:
PLAY [user module demo] **************************************************
TASK [Gathering Facts] **************************************************
ok: [demo.example.com]
TASK [create a disabled user] ********************************************
ok: [demo.example.com]
TASK [enable user] *******************************************************
changed: [demo.example.com]
PLAY RECAP ****************************************************************
demo.example.com : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
总结
在 Ansible 中,解锁用户密码时必须设置一个新密码,否则会导致“passwordless account”错误。通过使用 password 参数和 password_hash 过滤器,可以安全地解锁用户密码并设置新密码。