14

我有一个使用 vagrant 运行的虚拟机,我正在使用 Chef 配置它。其中一个步骤涉及克隆 git repo,但我的 ssh 密钥(在我的主机上)上有一个密码。

当我运行时vagrant up,该过程在 git clone 步骤失败并出现以下错误:(
Permission denied (publickey). fatal: The remote end hung up unexpectedly
密钥已添加到主机上,带有密码)

我尝试通过执行以下操作通过 ssh 代理转发解决此问题:
添加config.ssh.forward_agent = true到vm 上的已VagrantFile
添加Defaults env_keep = "SSH_AUTH_SOCK/etc/sudoers

现在,vagrant up当它到达 git clone 部分时仍然失败,但如果我vagrant provision在那之后运行,它就会通过。我猜这是因为 ssh 配置是在启动 vm 并且没有重新加载时设置的

在调整这两个设置后,我尝试重新加载 ssh,但这并没有帮助。

知道如何解决这个问题吗?

谢谢。

4

3 回答 3

10

正如您所指出的,在初始运行期间更新 sudoers 为时已晚,无法对该运行有益,因为此时 chef 已经在 sudo 下运行。

相反,我编写了一个 hacky recipe,它可以找到要使用的适当 ssh 套接字并更新 SSH_AUTH_SOCK 环境以适应。它还禁用严格的主机密钥检查,以便自动批准初始出站连接。

将此保存为在第一次 ssh 连接之前随时执行的配方(在 Ubuntu 上测试,但应与其他发行版一起使用):

Directory "/root/.ssh" do
  action :create
  mode 0700
end

File "/root/.ssh/config" do
  action :create
  content "Host *\nStrictHostKeyChecking no"
  mode 0600
end

ruby_block "Give root access to the forwarded ssh agent" do
  block do
    # find a parent process' ssh agent socket
    agents = {}
    ppid = Process.ppid
    Dir.glob('/tmp/ssh*/agent*').each do |fn|
      agents[fn.match(/agent\.(\d+)$/)[1]] = fn
    end
    while ppid != '1'
      if (agent = agents[ppid])
        ENV['SSH_AUTH_SOCK'] = agent
        break
      end
      File.open("/proc/#{ppid}/status", "r") do |file|
        ppid = file.read().match(/PPid:\s+(\d+)/)[1]
      end
    end
    # Uncomment to require that an ssh-agent be available
    # fail "Could not find running ssh agent - Is config.ssh.forward_agent enabled in Vagrantfile?" unless ENV['SSH_AUTH_SOCK']
  end
  action :create
end

或者,创建一个包含 sudoers 更新的框,并以此为基础创建未来的虚拟机。

于 2011-11-19T01:57:23.733 回答
3

这可能不是您正在寻找的答案,但一个简单的解决方法是生成一个没有密码的专用部署 ssh 密钥。我更喜欢单独和专用的部署密钥,而不是多个应用程序的单个密钥。

于 2011-11-11T19:08:57.573 回答
2

您可以使用 Vagrant 运行多个配置器(即使是相同类型的),每个配置器都在其自己的 SSH 连接上执行。我通常通过使用添加Added Defaults env_keep = "SSH_AUTH_SOCK"/etc/sudoersvm 的 Shell 配置程序来解决这个问题。

这是我用来执行此操作的 Bash 脚本:

#!/usr/bin/env bash

# Ensure that SSH_AUTH_SOCK is kept
if [ -n "$SSH_AUTH_SOCK" ]; then
  echo "SSH_AUTH_SOCK is present"
else
  echo "SSH_AUTH_SOCK is not present, adding as env_keep to /etc/sudoers"
  echo "Defaults env_keep+=\"SSH_AUTH_SOCK\"" >> "/etc/sudoers"
fi

我没有使用 Chef 配置器对此进行测试,仅使用额外的 Shell 配置器进行测试......但据我了解,这对于您的用例应该是一样的。

于 2012-08-08T07:14:52.513 回答