如何在Bash脚本中向vault-id传递Ansible Vault密码?
解决方案
方法一:通过进程替换直接传递密码
输入一次密码后,用Shell进程替换将密码传递给每个ansible-playbook命令,全程不会在磁盘存储密码文件:
# 隐藏式读取密码(-s参数避免输入内容显示在终端) read -s -p "请输入Ansible Vault密码: " vault_password echo # 换行,避免后续命令和输入提示挤在一起 # 执行第一个Playbook ansible-playbook check_patch_applied.yml \ --extra-vars="target=123 patch_number=232323" \ -v \ --vault-id @<(echo "$vault_password") # 执行第二个Playbook ansible-playbook apply_patch.yml \ --extra-vars="target=np026 patch_number=232323" \ -v \ --vault-id @<(echo "$vault_password")
方法二:利用环境变量统一配置(更简洁)
通过设置ANSIBLE_VAULT_PASSWORD_FILE环境变量,让所有后续ansible-playbook命令自动复用同一个密码源,无需重复添加--vault-id参数:
read -s -p "请输入Ansible Vault密码: " vault_password echo # 将进程替换的结果作为密码文件源 export ANSIBLE_VAULT_PASSWORD_FILE=<(echo "$vault_password") # 后续执行Playbook无需再指定密码参数 ansible-playbook check_patch_applied.yml --extra-vars="target=123 patch_number=232323" -v ansible-playbook apply_patch.yml --extra-vars="target=np026 patch_number=232323" -v
你之前的语法错误原因
- 进程替换格式错误:你写的
< (echo ...)中间有空格,Shell进程替换要求<(必须连在一起,不能有空格,这是导致unexpected token '('报错的核心原因。 - 参数混用错误:第二种写法同时使用了
@prompt和进程替换,@prompt是让Ansible主动弹出密码输入框,和进程替换的自动输入逻辑冲突,二者不能同时使用。 - 语法残留:第一种写法末尾多了一个无关的单引号,导致Shell解析失败。
内容的提问来源于stack exchange,提问作者AUser
相关产品推荐
相关产品推荐

