在vagrant + chef设置中使用带密码的ssh密钥

Shr*_*ans 14 git ssh chef-infra vagrant

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

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

我试图使用ssh代理转发来解决这个通过执行以下操作:
添加config.ssh.forward_agent = trueVagrantFile
添加Defaults env_keep = "SSH_AUTH_SOCK/etc/sudoers虚拟机上

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

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

不知道怎么解决这个问题?

谢谢.

小智 10

正如您所指出的那样,在初始运行期间更新sudoers为时已晚,无法有利于该运行,因为此时厨师已经在sudo下运行.

相反,我编写了一个hacky配方,找到要使用的相应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
Run Code Online (Sandbox Code Playgroud)

或者,创建一个包含sudoers update的框,并将未来的VM作为其基础.

  • 对于那些想在bash中做同样事情的人:https://gist.github.com/bendavis78/5464209.请参阅此处有关如何在Vagrantfile中添加此内容的信息:http://docs-v1.vagrantup.com/v1/docs/provisioners/shell.html (2认同)