Public 使用 Jenkins 从 Ansible 中的 Bitbucket 获取密钥时被拒绝
Public key denied when fetching from Bitbucket in Ansbile with Jenkins
我想做什么:
我有一个 Ansible 脚本,它从 Bitbucket 中执行 git 克隆,我正在 运行 通过 Ansible 插件从 jenkins 中获取该脚本。
路线:
Jenkins server ---(ansible)---> App server ----(git)---> bitbucket.org
我正在尝试使用 Jenkins 服务器上的 ssh 私钥从 App 服务器连接到 Bitbucket 上的存储库,这应该可以在 ssh-agent
的帮助下实现。
出了什么问题:
Ansible 脚本无法使用 Public key denied
连接到 Bitbucket。
我检查过的内容:
- Jenkins 上的 public 密钥已添加到部署密钥列表中,它确实可以在没有权限问题的情况下工作。
ssh-agent
在jenkins节点上运行ning,jenkins上的私钥已添加
AllowFowardAgent
在服务器上已设置为 yes
。
- jenkins 的 ansible 插件将私钥复制到
/tmp
并在 运行ning 剧本时使用它。它与我 ssh-add
-ed 的文件路径不同,但我认为这不是导致问题的原因。
詹金斯代码
在 运行 执行 Ansible 任务之前,我先有以下 shell 脚本 运行:
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
cat >~/.ssh/config <<EOL
Host *
ForwardAgent yes
EOL
cat ~/.ssh/config
git clone git@bitbucket.org:myuser/myrepo.git
Ansible 代码
我的剧本:
- name: check SSH_AUTH_SOCK
shell: echo "$SSH_AUTH_SOCK"
- name: check ssh-agent forwarding
shell: ssh -T git@bitbucket.org
我的ansible.cfg
:
[ssh_connection]
ssh_args = -o ForwardAgent=yes -o StrictHostKeyChecking=no -C -o ControlMaster=auto -o ControlPersist=60s
输出
在我的 Ansible 脚本中,我可以看到 SSH_AUTH_SOCK
已设置:
11:29:04 changed: [testserver] => {"changed": true, "cmd": "echo \"$SSH_AUTH_SOCK\"", "delta": "0:00:00.007881", "end": "2016-09-06 11:29:04.576963", "invocation": {"module_args": {"_raw_params": "echo \"$SSH_AUTH_SOCK\"", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 0, "start": "2016-09-06 11:29:04.569082", "stderr": "", "stdout": "/tmp/ssh-WnmHgtzMBS/agent.13630", "stdout_lines": ["/tmp/ssh-WnmHgtzMBS/agent.13630"], "warnings": []}
但是 ssh -T git@bitbucket.org
失败了:
11:29:09 fatal: [testserver]: FAILED! => {"changed": true, "cmd": "ssh -T git@bitbucket.org", "delta": "0:00:05.009720", "end": "2016-09-06 11:29:09.879430", "failed": true, "invocation": {"module_args": {"_raw_params": "ssh -T git@bitbucket.org", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 255, "start": "2016-09-06 11:29:04.869710", "stderr": "Error reading response length from authentication socket.\r\nPermission denied (publickey).", "stdout": "", "stdout_lines": [], "warnings": []}
当你执行ssh-agent -s
时会输出一系列环境变量,这些是SSH代理转发功能所需要的,例如:
SSH_AUTH_SOCK=/var/folders/nw/2vnhg_gj77v_cyfv0p1vdfj80000gn/T//ssh-alCh0yLKdoci/agent.53532; export SSH_AUTH_SOCK; SSH_AGENT_PID=53533; export SSH_AGENT_PID; echo Agent pid 53533;
当你 运行 通过 eval
这些命令在当前 shell 会话中执行时,你可以看到最后一个 (echo
) 的输出:
Agent pid 53533
然而,环境变量是为当前进程和子进程设置的。如果您从不同的进程调用 Ansible 剧本,它们将不会被看到。
正如您已经知道的那样,Jenkins 的 SSH 代理插件会小心翼翼地让其他进程(如 Ansible 插件)继承这些环境变量。
我想做什么:
我有一个 Ansible 脚本,它从 Bitbucket 中执行 git 克隆,我正在 运行 通过 Ansible 插件从 jenkins 中获取该脚本。
路线:
Jenkins server ---(ansible)---> App server ----(git)---> bitbucket.org
我正在尝试使用 Jenkins 服务器上的 ssh 私钥从 App 服务器连接到 Bitbucket 上的存储库,这应该可以在 ssh-agent
的帮助下实现。
出了什么问题:
Ansible 脚本无法使用 Public key denied
连接到 Bitbucket。
我检查过的内容:
- Jenkins 上的 public 密钥已添加到部署密钥列表中,它确实可以在没有权限问题的情况下工作。
ssh-agent
在jenkins节点上运行ning,jenkins上的私钥已添加AllowFowardAgent
在服务器上已设置为yes
。- jenkins 的 ansible 插件将私钥复制到
/tmp
并在 运行ning 剧本时使用它。它与我ssh-add
-ed 的文件路径不同,但我认为这不是导致问题的原因。
詹金斯代码
在 运行 执行 Ansible 任务之前,我先有以下 shell 脚本 运行:
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
cat >~/.ssh/config <<EOL
Host *
ForwardAgent yes
EOL
cat ~/.ssh/config
git clone git@bitbucket.org:myuser/myrepo.git
Ansible 代码
我的剧本:
- name: check SSH_AUTH_SOCK
shell: echo "$SSH_AUTH_SOCK"
- name: check ssh-agent forwarding
shell: ssh -T git@bitbucket.org
我的ansible.cfg
:
[ssh_connection]
ssh_args = -o ForwardAgent=yes -o StrictHostKeyChecking=no -C -o ControlMaster=auto -o ControlPersist=60s
输出
在我的 Ansible 脚本中,我可以看到 SSH_AUTH_SOCK
已设置:
11:29:04 changed: [testserver] => {"changed": true, "cmd": "echo \"$SSH_AUTH_SOCK\"", "delta": "0:00:00.007881", "end": "2016-09-06 11:29:04.576963", "invocation": {"module_args": {"_raw_params": "echo \"$SSH_AUTH_SOCK\"", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 0, "start": "2016-09-06 11:29:04.569082", "stderr": "", "stdout": "/tmp/ssh-WnmHgtzMBS/agent.13630", "stdout_lines": ["/tmp/ssh-WnmHgtzMBS/agent.13630"], "warnings": []}
但是 ssh -T git@bitbucket.org
失败了:
11:29:09 fatal: [testserver]: FAILED! => {"changed": true, "cmd": "ssh -T git@bitbucket.org", "delta": "0:00:05.009720", "end": "2016-09-06 11:29:09.879430", "failed": true, "invocation": {"module_args": {"_raw_params": "ssh -T git@bitbucket.org", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 255, "start": "2016-09-06 11:29:04.869710", "stderr": "Error reading response length from authentication socket.\r\nPermission denied (publickey).", "stdout": "", "stdout_lines": [], "warnings": []}
当你执行ssh-agent -s
时会输出一系列环境变量,这些是SSH代理转发功能所需要的,例如:
SSH_AUTH_SOCK=/var/folders/nw/2vnhg_gj77v_cyfv0p1vdfj80000gn/T//ssh-alCh0yLKdoci/agent.53532; export SSH_AUTH_SOCK; SSH_AGENT_PID=53533; export SSH_AGENT_PID; echo Agent pid 53533;
当你 运行 通过 eval
这些命令在当前 shell 会话中执行时,你可以看到最后一个 (echo
) 的输出:
Agent pid 53533
然而,环境变量是为当前进程和子进程设置的。如果您从不同的进程调用 Ansible 剧本,它们将不会被看到。
正如您已经知道的那样,Jenkins 的 SSH 代理插件会小心翼翼地让其他进程(如 Ansible 插件)继承这些环境变量。