在Ansible中创建SSH密钥并立即使用的权限问题排查
答:SSH密钥创建后无法克隆Github仓库的问题解决
你的猜测是否合理?
合理。核心原因有两点:
- Ansible的每个任务都在独立子shell中执行,默认不会继承当前终端会话的
ssh-agent环境变量(比如SSH_AUTH_SOCK),即便终端里已启动ssh-agent,Ansible任务也无法复用这个代理。 - 新生成的SSH密钥不会自动被
ssh-agent加载,必须显式执行ssh-add命令添加;且就算在某个任务中启动ssh-agent并添加密钥,后续任务因为是新子shell,也无法共享这个代理状态。
如何让Ansible使用新生成的SSH密钥?
推荐两种直接可靠的方案,比强制加载ssh-agent更易维护:
方案1:Git任务直接指定SSH密钥
通过环境变量让git模块强制使用新生成的密钥,无需依赖ssh-agent:
- name: Clone OTP git: clone: true dest: "{{code_folder}}/otp" remote: upstream repo: git@github.com:erlang/otp.git version: maint environment: GIT_SSH_COMMAND: "ssh -i ~/.ssh/{{ssh_key_filename}} -o IdentitiesOnly=yes"
IdentitiesOnly=yes的作用是强制ssh仅使用指定密钥,避免尝试其他密钥导致认证失败。
方案2:临时启动ssh-agent并传递环境变量(多任务复用密钥场景)
如果后续还有多个需要该密钥的任务,可在Playbook内启动ssh-agent,并将环境变量传递给后续任务:
- name: Start ssh-agent and add target key shell: | eval $(ssh-agent -s) ssh-add ~/.ssh/{{ssh_key_filename}} echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" echo "SSH_AGENT_PID=$SSH_AGENT_PID" register: ssh_agent_env - name: Save ssh-agent environment variables set_fact: ssh_auth_sock: "{{ ssh_agent_env.stdout_lines[0].split('=')[1] }}" ssh_agent_pid: "{{ ssh_agent_env.stdout_lines[1].split('=')[1] }}" - name: Clone OTP using ssh-agent git: clone: true dest: "{{code_folder}}/otp" remote: upstream repo: git@github.com:erlang/otp.git version: maint environment: SSH_AUTH_SOCK: "{{ ssh_auth_sock }}" SSH_AGENT_PID: "{{ ssh_agent_pid }}"
注意:该代理仅在当前Playbook会话中有效,Playbook执行结束后ssh-agent进程会自动退出。
额外优化建议
可添加预校验任务,提前验证SSH密钥是否能正常连接Github,避免克隆阶段才发现问题:
- name: Test Github SSH authentication command: ssh -T git@github.com -i ~/.ssh/{{ssh_key_filename}} -o IdentitiesOnly=yes register: ssh_test_result ignore_errors: true - name: Fail if SSH authentication fails fail: msg: "SSH认证失败,请确认公钥已正确添加到Github账户" when: "'Hi' not in ssh_test_result.stdout"
内容的提问来源于stack exchange,提问作者Kiko Fernandez
相关产品推荐
相关产品推荐

