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
相关产品推荐
相关产品推荐

