You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中实现Linux用户密码的幂等设置?

解决Ansible user模块每次执行都提示密码更改的问题

我太懂这种每次跑playbook都看到密码被修改的烦躁了!其实这个问题的根源特别明确:Ansible的user模块要求password参数必须传入加密后的哈希值,而不是明文密码。

你现在传入的是明文123456,Ansible每次都会把这个明文和目标系统/etc/shadow里存储的加密哈希值做对比——显然完全不匹配,所以每次都会触发“密码更改”的操作,这和Ansible版本、目标发行版、update_password参数都没关系。

解决方案

方法1:用Ansible自带的password_hash过滤器实时生成哈希

直接修改你的playbook,把明文密码转换成符合系统要求的哈希值,示例如下:

- name: This is in vault in real playbook of course
  set_fact:
    testuser_password : '123456'  # 实际是vault解密后的明文

- name: Manage test user
  user:
    name: testuser
    uid: 1001
    state: present
    # 用password_hash生成sha512格式哈希(主流Linux发行版默认采用该格式)
    password: "{{ testuser_password | password_hash('sha512') }}"

方法2:提前生成哈希值存入vault

如果你不想每次执行都动态生成哈希(其实性能影响可以忽略),可以提前用工具生成好哈希值,比如用Python的passlib库:

from passlib.hash import sha512_crypt
print(sha512_crypt.hash("123456"))

把生成的哈希值直接存在vault里,再在playbook中引用:

- name: This is in vault in real playbook of course
  set_fact:
    testuser_password_hash : '$6$rounds=656000$xxxxxxxxx$xxxxxxxxx'  # 提前生成的哈希值

- name: Manage test user
  user:
    name: testuser
    uid: 1001
    state: present
    password: "{{ testuser_password_hash }}"

验证效果

修改后第一次执行playbook会真正设置密码,之后再执行时,Ansible会对比传入的哈希值和/etc/shadow里的存储值,完全匹配就不会再提示密码更改了。

内容的提问来源于stack exchange,提问作者miwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:14:05