在 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 过滤器,可以安全地解锁用户密码并设置新密码。