2011-08-26 92 views
14

我有一個使用流浪漢的虛擬機運行,並且我正在與廚師配備。其中一個步驟涉及克隆git repo,但是我的ssh-key(在我的主機上)上有一個密碼短語。在流浪漢+廚師設置上使用帶密碼的ssh密鑰

當運行vagrant up,則過程失敗在與以下錯誤git的克隆步驟:
Permission denied (publickey). fatal: The remote end hung up unexpectedly
(關鍵已被添加在主機上,與所述密碼短語)

我試圖
新增config.ssh.forward_agent = trueVagrantFile
新增Defaults env_keep = "SSH_AUTH_SOCK至:通過執行以下操作使用ssh代理轉發來解決這個上的虛擬機

現在,vagrant up仍然失敗,當它到達git克隆部分,但如果我運行vagrant provision後,它通過。我猜這是因爲ssh配置設置了虛擬機啓動時,並沒有重新加載

我試圖重新加載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 

或者在它和基礎已經建立與sudoers的更新一箱你未來的虛擬機就是這樣。

+0

感謝這工作對我來說! – Anentropic

+0

真棒,作品! –

+2

對於那些想在bash中做同樣事情的人:https://gist.github.com/bendavis78/5464209。請參閱此處瞭解如何在Vagrantfile中添加此項:http://docs-v1.vagrantup.com/v1/docs/provisioners/shell.html –

3

這可能不是您正在尋找的答案,但對此的簡單解決方法是生成專用的部署ssh密鑰而不使用密碼。我更喜歡單獨和專用的部署密鑰,而不是多個應用程序的單個密鑰。

2

您可以使用Vagrant運行多個置備程序(即使是同一種),每個置備程序都會在自己的SSH連接上執行。我通常通過使用Shell配置程序來解決此問題,該配置程序在vm上將Added Defaults env_keep = "SSH_AUTH_SOCK"添加到/etc/sudoers

這裏是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 

我還沒有與廚師預配測試這一點,只有額外的殼牌供應方...但是從我的理解這應該工作你的用例也一樣。