从Ansible Vault获取sudo密码失败:set_fact设置ansible_become_pass无效
Ansible Vault密码生效问题排查与解决
核心问题:变量引用写法错误
你在set_fact里写的"{{ ansible_hostname }}.ansible_become_pass"是字符串拼接操作,实际得到的是host1.ansible_become_pass这类文本,而非Vault中host1变量下的真实密码值。sudo时传递的是这个错误字符串,自然会触发密码不正确的提示。
修正写法
方式1:直接引用Vault变量(适合单主机场景)
如果你的inventory主机名和Vault里的键名完全一致(比如inventory里是host1,Vault里的键也是host1),直接硬引用即可:
- name: Set Facts set_fact: ansible_ssh_pass: "{{ host1.ansible_ssh_pass }}" ansible_become_pass: "{{ host1.ansible_become_pass }}"
方式2:动态引用变量(适配多主机场景)
如果需要管理多台主机,不想硬编码主机名,用vars关键字动态获取顶层变量:
- name: Set Facts set_fact: ansible_ssh_pass: "{{ vars[ansible_hostname].ansible_ssh_pass }}" ansible_become_pass: "{{ vars[ansible_hostname].ansible_become_pass }}"
也可以用lookup实现相同效果:
- name: Set Facts set_fact: ansible_ssh_pass: "{{ lookup('vars', ansible_hostname).ansible_ssh_pass }}" ansible_become_pass: "{{ lookup('vars', ansible_hostname).ansible_become_pass }}"
额外优化:无需set_fact也能实现
其实完全不需要set_fact步骤——Ansible加载vars_files后,Vault里的变量已经全局可用。你可以直接在inventory中关联这些密码变量:
# inventory文件示例 host1 ansible_ssh_pass="{{ host1.ansible_ssh_pass }}" ansible_become_pass="{{ host1.ansible_become_pass }}"
这样playbook里不用额外设置,sudo任务就能直接正常执行。
验证方法
修改set_fact后重新运行playbook,查看show set_fact ansible_become_pass的debug输出,应该显示真实密码值(而非host1.ansible_become_pass字符串),此时sudo任务即可正常运行。
内容的提问来源于stack exchange,提问作者Magnus Persson
相关产品推荐
相关产品推荐

