You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action部署Ansible Playbook至私有子网EC2遇连接问题

问题描述

尝试通过GitHub Actions运行Ansible Playbook连接私有子网内的EC2实例时失败,相关配置及错误如下:

GitHub Actions Workflow 配置

steps:
  - name: Checkout
    uses: actions/checkout@v3
  - name: terraform ssh key
    uses: webfactory/ssh-agent@v0.7.0
    with:
      ssh-private-key: ${{ secrets.EC2_PRIVATE_KEY }}
  - name: Run playbook
    uses: dawidd6/action-ansible-playbook@v2
    with:
      playbook: deploy.yaml
      directory: ./
      inventory: |
        [all]
        10.2.13.227

Ansible Playbook 内容

- hosts: all
  vars:
    - ansible_ssh_user: "admin"
    - ansible_ssh_common_args: >
          -o ProxyCommand="ssh -W %h:%p -q ec2-user@13.37.97.97" -i ~/keys/fr-prod.pem \
          -o ServerAliveInterval=5 \
          -o StrictHostKeyChecking=no
  tasks:
    - name: example
      debug:
        msg: Hello World from {{ inventory_hostname }}!

预期结果

成功连接私有实例并输出:

Hello World from 10.2.13.227

实际错误

fatal: [10.2.13.227]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: kex_exchange_identification: Connection closed by remote host\r\nConnection closed by UNKNOWN port 65535", "unreachable": true}

怀疑问题出在SSH密钥转发配置不正确,求解决方法。

解决方案

1. 修正ProxyCommand的密钥引用与代理转发配置

你在ansible_ssh_common_args中指定的-i ~/keys/fr-prod.pem无效——GitHub Actions环境中没有这个路径的密钥,webfactory/ssh-agent已经将密钥加载到SSH代理中,无需手动指定密钥文件。

修改后的ansible_ssh_common_args需开启代理转发,并移除无效的密钥路径:

ansible_ssh_common_args: >
      -o ProxyCommand="ssh -W %h:%p -q -A ec2-user@13.37.97.97" \
      -o ServerAliveInterval=5 \
      -o StrictHostKeyChecking=no

其中-A参数用于开启SSH代理转发,让跳板机(13.37.97.97)使用本地代理中的密钥连接私有实例。

2. 确认跳板机允许代理转发

检查跳板机(13.37.97.97)的/etc/ssh/sshd_config文件,确保存在AllowAgentForwarding yes配置,修改后重启sshd服务生效。

3. 确保SSH代理环境变量传递正常

webfactory/ssh-agent会自动设置SSH_AUTH_SOCK环境变量,dawidd6/action-ansible-playbook默认会继承该变量,若出现异常可显式传递:

- name: Run playbook
  uses: dawidd6/action-ansible-playbook@v2
  env:
    SSH_AUTH_SOCK: ${{ env.SSH_AUTH_SOCK }}
  with:
    playbook: deploy.yaml
    directory: ./
    inventory: |
      [all]
      10.2.13.227

4. 验证用户SSH登录权限

确认私有实例的admin用户允许密钥登录,同时跳板机的ec2-user用户也能正常通过密钥登录。

5. 测试代理连通性

在GitHub Actions中添加测试步骤,直接验证跳板机到私有实例的连通性,快速定位问题环节:

- name: Test proxy connection
  run: ssh -A ec2-user@13.37.97.97 ssh admin@10.2.13.227 "echo 'Connected'"

内容的提问来源于stack exchange,提问作者phil brady

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:48:17