如何在Ansible EE执行剧本前运行命令解锁Bitwarden Vault?
问题分析
你配置的exec.command实际是替换了ansible-navigator默认的执行命令(比如ansible-playbook),而非在剧本执行前额外运行解锁命令,因此你的Bitwarden登录命令根本没被执行,Vault自然处于锁定状态。
解决方案
以下是几种可行的配置方式:
方法1:使用ansible-navigator的pre-run脚本(推荐)
ansible-navigator 2.0及以上版本支持pre-run配置,可指定在EE内部、剧本执行前运行的命令或脚本。
修改ansible-navigator.yml:
ansible-navigator: execution-environment: container-engine: docker image: <image>:latest environment-variables: pass: - BW_PASSWORD pre-run: command: "export BW_SESSION=$(bw login <mail> --raw --passwordenv BW_PASSWORD)"
如果需要复杂逻辑,可将命令写成shell脚本,挂载到EE中后指定脚本路径作为pre-run.command。
方法2:自定义Execution Environment镜像
若需长期复用解锁逻辑,可自定义EE镜像,将登录命令整合到镜像的entrypoint:
- 创建
Containerfile:
FROM <your-base-ee-image>:latest # 若基础镜像未安装bw-cli,执行安装 RUN pip install bw-cli # 添加自定义entrypoint脚本 COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
- 编写
entrypoint.sh:
#!/bin/bash # 执行Bitwarden登录并设置会话变量 export BW_SESSION=$(bw login <mail> --raw --passwordenv BW_PASSWORD) # 传递后续执行命令(如ansible-playbook) exec "$@"
- 构建镜像后,在ansible-navigator配置中使用该自定义镜像。
方法3:在Ansible剧本中使用pre_tasks
在剧本开头添加pre_tasks,在EE内部的localhost节点执行登录命令,并将BW_SESSION设为全局环境变量:
- name: 解锁Bitwarden Vault hosts: localhost gather_facts: false pre_tasks: - name: 登录Bitwarden获取会话 shell: bw login <mail> --raw --passwordenv BW_PASSWORD environment: BW_PASSWORD: "{{ lookup('env', 'BW_PASSWORD') }}" register: bw_session - name: 设置BW_SESSION环境变量 set_fact: ansible_env: "{{ ansible_env | combine({'BW_SESSION': bw_session.stdout}) }}" tasks: - name: 获取Bitwarden密码 debug: msg: "{{ lookup('community.general.bitwarden', '<title>', field='password') }}"
需确保剧本运行时localhost指向EE内部节点,且环境变量能传递给查找插件。
验证要点
- 确认EE镜像已安装
bw-cli工具,否则登录命令会失败 - 检查
BW_PASSWORD是否正确传入EE,可在pre-run或pre-tasks中添加echo $BW_PASSWORD验证 - 登录后可执行
bw status确认Vault是否已解锁
内容的提问来源于stack exchange,提问作者Shade
相关产品推荐
相关产品推荐

