GitHub Runner运行dawidd6/action-ansible-playbook前安装jmespath依赖失败排查求助
首先,问题的核心原因是:你通过actions/setup-python配置的Python 3.11环境,和dawidd6/action-ansible-playbook使用的Ansible运行环境不是同一个。
dawidd6/action-ansible-playbook默认会在GitHub Runner上独立安装Ansible(通常是使用系统自带的Python环境,或者单独安装的Python),而你之前用pip3 install jmespath安装的依赖只存在于你指定的Python 3.11环境中,因此Ansible无法找到它,导致json_query过滤器报错。
下面提供几个可行的解决方案:
方案一:让Ansible Action使用你配置的Python环境
你可以通过python_interpreter参数,指定Ansible使用你之前设置的Python 3.11环境。步骤如下:
- 先获取你配置的Python路径并保存为输出变量:
- name: Get configured Python path id: get-python-path run: echo "path=$(which python3)" >> $GITHUB_OUTPUT
- 在运行Ansible Playbook的步骤中,添加
python_interpreter参数:
- name: Run playbook uses: dawidd6/action-ansible-playbook@v2 with: playbook: provision_vps.yml directory: ./ansible key: ${{secrets.ANSIBLE_PRIVATE_KEY}} vault_password: ${{secrets.ANSIBLE_VAULT_PASS}} python_interpreter: ${{ steps.get-python-path.outputs.path }} options: | --inventory hosts.inventory --verbose
这样Ansible就会使用你安装了jmespath的Python环境,自然就能找到依赖了。
方案二:在Ansible使用的环境中安装jmespath
如果你不确定Ansible会使用哪个Python环境,可以直接针对Runner上所有可能的Python环境安装jmespath,确保覆盖到Ansible的运行环境:
- name: Install Jmespath for all Python environments run: | # 给系统Python安装 sudo pip3 install jmespath # 给你配置的Python安装 pip3 install jmespath # 通过apt安装系统级的python3-jmespath sudo apt install -y python3-jmespath
这种方式比较直接,能确保不管Ansible用哪个Python版本,都能找到jmespath依赖。
方案三:验证Ansible使用的Python环境
如果上面的方案都不生效,你可以先在流水线中添加一个步骤,确认Ansible实际使用的Python版本和路径,再针对性安装:
- name: Check Ansible's Python environment run: | # 先安装Ansible(模拟Action的安装行为) sudo apt update && sudo apt install -y ansible # 查看Ansible使用的Python版本和路径 ansible --version | grep "python version" which ansible
根据输出的路径,直接给对应的Python安装jmespath即可,比如如果输出显示Ansible用的是/usr/bin/python3,就执行sudo /usr/bin/python3 -m pip install jmespath。
内容的提问来源于stack exchange,提问作者user16891224

