使用带密码短语的SSH-key通过Ansible执行git pull遇权限拒绝问题排查
问题背景
使用Ansible通过带密码短语的SSH-key执行git pull时出现Permission denied (publickey)错误,已在本地启动ssh-agent并执行eval \ssh-agent -s`、ssh-add /root/.ssh/new_rsa`输入密码短语,但问题仍存在。
相关配置
Ansible Playbook
- hosts: testnew gather_facts: no become: yes tasks: - name: Git update git: key_file: /root/.ssh/new_rsa repo: git@bitbucket.org:Ads/ads.git dest: /path/ accept_hostkey: yes remote: origin update: yes version: feature/out ignore_errors: yes
ansible.cfg配置
[defaults] inventory=/etc/ansible/hosts #transport = ssh enable_task_debugger = False host_key_checking = False become_flags=-HE ssh_args = -o ForwardAgent=yes -o ControlPath=/tmp/ssh-%r@%h:%p -o ControlMaster=auto -o ControlPersist=30s
报错信息
"msg": "Failed to download remote objects and refs: git@bitbucket.org: Permission denied (publickey).\r\nfatal: Could not read from remote repository.\n\nPlease make sure you have the correct access rights\nand the repository exists.\n"
排查步骤
检查密钥文件权限:SSH对密钥权限要求严格,确保目标机器上
/root/.ssh/new_rsa权限为600,父目录/root/.ssh权限为700。可在Playbook中添加前置任务修正:- name: Fix SSH key permissions file: path: /root/.ssh/new_rsa mode: '0600' - name: Fix .ssh directory permissions file: path: /root/.ssh mode: '0700'验证become后的环境变量继承:
become: yes切换到root时,需确保ssh-agent的环境变量(如SSH_AUTH_SOCK)被继承。可在git任务中显式传递环境变量:- name: Git update git: repo: git@bitbucket.org:Ads/ads.git dest: /path/ accept_hostkey: yes remote: origin update: yes version: feature/out environment: SSH_AUTH_SOCK: "{{ ansible_env.SSH_AUTH_SOCK }}" ignore_errors: yes同时确认
become_flags=-HE中的-E参数已生效(该参数用于保留原用户环境变量)。目标机器手动测试git命令:登录目标机器
testnew,切换到root用户,执行git clone git@bitbucket.org:Ads/ads.git /tmp/test。若失败,说明问题不在Ansible:- 检查Bitbucket账号是否已添加该密钥的公钥;
- 确认密钥对与Bitbucket配置的公钥匹配;
- 测试
ssh -T git@bitbucket.org验证SSH连接是否正常。
检查SSH Agent转发是否生效:在目标机器执行
ssh-add -l,若看不到本地添加的密钥,说明Agent转发未生效:- 确认ansible.cfg中的
ssh_args = -o ForwardAgent=yes配置正确; - 检查目标机器sshd_config中
AllowAgentForwarding是否设为yes(默认允许,若被修改需调整)。
- 确认ansible.cfg中的
避免key_file与Agent转发冲突:若已启用Agent转发,可尝试移除git模块中的
key_file参数,让git优先使用Agent中的密钥,避免参数冲突导致的权限问题。尝试使用普通用户执行:root用户的环境可能存在权限或配置异常,可切换为普通用户执行git操作,确保密钥在该用户的
.ssh目录下且权限正确。
内容的提问来源于stack exchange,提问作者emdnk

