如何在Python脚本中使用ansible_runner传递Ansible Vault密码文件
问题描述
我有一个Python脚本,通过ansible_runner运行Ansible playbook来获取OAuth2的access token并保存到文件。密钥存储在ansible-vault中,尝试用cmdline='--vault-password-file vault-pass.txt'传递密码文件,但执行失败,返回rc=1,状态为failed。
代码示例:
import streamlit as st import ansible_runner st.header("ReadOnly view") st.write(f"You are logged in as {st.session_state.role} user.") st.write(st.session_state.get('selected_site', 'No site selected')) # Run the Ansible playbook gToken=ansible_runner.run(private_data_dir='/indra/ansible/playbooks',playbook='get_authtoken.yml', cmdline='--vault-password-file vault-pass.txt') st.write(gToken.rc) st.write(gToken.status)
执行输出:
ReadOnly You are logged in as ReadOnly user. test-nsxt01.nfv.example.net 1 failed
解决方案
直接通过cmdline传递vault参数可能存在解析问题,ansible-runner提供了专门的参数来处理vault密码,推荐以下两种可靠方式:
1. 使用vault_password_file参数(官方推荐)
ansible_runner.run()支持直接传入vault_password_file参数,无需通过cmdline拼接,这是最规范的用法:
修改后的代码:
import streamlit as st import ansible_runner st.header("ReadOnly view") st.write(f"You are logged in as {st.session_state.role} user.") st.write(st.session_state.get('selected_site', 'No site selected')) # 替换为vault-pass.txt的实际绝对路径,避免相对路径导致的问题 vault_pass_path = '/full/path/to/vault-pass.txt' # Run the Ansible playbook gToken=ansible_runner.run( private_data_dir='/indra/ansible/playbooks', playbook='get_authtoken.yml', vault_password_file=vault_pass_path ) st.write(gToken.rc) st.write(gToken.status)
2. 通过环境变量传递
如果偏好使用cmdline方式,可以先设置ANSIBLE_VAULT_PASSWORD_FILE环境变量,再执行runner:
import os import streamlit as st import ansible_runner st.header("ReadOnly view") st.write(f"You are logged in as {st.session_state.role} user.") st.write(st.session_state.get('selected_site', 'No site selected')) # 设置环境变量指定密码文件路径 os.environ['ANSIBLE_VAULT_PASSWORD_FILE'] = '/full/path/to/vault-pass.txt' # Run the Ansible playbook gToken=ansible_runner.run( private_data_dir='/indra/ansible/playbooks', playbook='get_authtoken.yml' ) st.write(gToken.rc) st.write(gToken.status)
排查要点
- 确认密码文件路径正确:优先使用绝对路径,避免脚本运行工作目录与文件所在目录不一致导致的找不到文件问题。
- 检查文件权限:运行脚本的用户必须拥有读取该密码文件的权限。
- 手动测试playbook:在终端执行
ansible-playbook /indra/ansible/playbooks/get_authtoken.yml --vault-password-file vault-pass.txt,验证playbook本身是否能正常运行,排除playbook逻辑问题。
内容的提问来源于stack exchange,提问作者RAY
相关产品推荐
相关产品推荐

