我看过类似的问题,但还没找到答案。
我可以通过SSH连接到服务器(Ubuntu 16.04)并手动克隆我的git repo。这让我相信它不是SSHForwardAgent问题。
错误非常典型:
"Cloning into bare repository '/home/deploy/apps/MYPROJECT/production/cached-copy'...",
"Permission denied (publickey).",
"fatal: Could not read from remote repository.",
ansible.cnf:
[ssh_connection]
ssh_args = -o ForwardAgent=yes
角色如下所示:
- name: Update the bare Git repository
become_user: "{{ deploy_user }}"
git:
repo: "git@github.com:MYUSER/MYPROJECT.git"
dest: "{{ deploy_to }}/cached-copy"
version: "{{ branch }}"
bare: yes
update: yes
accept_hostkey: yes
ssh_opts: "-o StrictHostKeyChecking=no -o ForwardAgent=yes"
Ansible的详细输出是:
"changed": false,
"cmd": "/usr/bin/git clone --bare '' /home/deploy/apps/MYPROJECT/production/cached-copy",
"failed": true,
"invocation": {
"module_args": {
"accept_hostkey": true,
"bare": true,
"clone": true,
"depth": null,
"dest": "/home/deploy/apps/MYPROJECT/production/cached-copy",
"executable": null,
"force": false,
"key_file": null,
"recursive": true,
"reference": null,
"refspec": null,
"remote": "origin",
"repo": "git@github.com:MYUSER/MYPROJECT.git",
"ssh_opts": "-o StrictHostKeyChecking=no -o ForwardAgent=yes",
"track_submodules": false,
"umask": null,
"update": true,
"verify_commit": false,
"version": "master"
MYUSER和MYPROJECT的使用是收回此类信息。
有一件事看起来很可疑cmd
它不包含repo网址,这是正常的吗?
如果我将-o ForwardAgent=yes
更改为-A
,我会收到其他错误:Timeout (12s) waiting for privilege escalation prompt
。
我也知道AgentForward正在工作,因为如果我进入服务器并执行ssh -T git@github.com
我得到预期的“你已经成功通过身份验证,但GitHub不提供shell访问权限。”。
请注意我不想在服务器上安装私钥。
更新:以下是详细输出的要点:https://gist.github.com/krisleech/8bfbf817c237258a672b3b3393fea8dd
另一方面,这似乎工作正常:
- name: "Test github"
command: ssh -T git@github.com
答案 0 :(得分:4)
从详细输出中我看到:
admin
用户和ForwardAgent=yes
deploy
的身份运行Ansible任务(git模块)这是我在评论中描述的场景,在执行sudo(使用常规设置)时,您可以有效地禁用ssh代理访问。
要使这项工作正常,您需要直接与deploy
用户进行ssh(而不是使用admin->deploy
),或者在目标框中设置sudo
以允许保留环境变量,请参阅this answer了解详情。
将
Defaults env_keep+=SSH_AUTH_SOCK
添加到sudoers
答案 1 :(得分:0)
缺少repo
参数的协议。来自ansible-doc
:
# Example git checkout from Ansible Playbooks - git: repo: git://foosball.example.org/path/to/repo.git dest: /srv/checkout
尝试将git:
或ssh:
添加到repo
参数。