如何在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
相关产品推荐
相关产品推荐

