2011-08-26 10 views
14

私は迷路を使ってVMを稼働させており、シェフとプロビジョニングしています。手順の1つにgit repoのクローン作成が含まれますが、私のssh-key(私のホストマシン上)にはパスフレーズがあります。迷路+シェフの設定でパスフレーズ付きのsshキーを使用

私はvagrant upを実行すると、プロセスは次のエラーでgitのクローンの段階で失敗します。
Permission denied (publickey). fatal: The remote end hung up unexpectedly
(キーがパスフレーズで、ホストマシン上で追加されました)

私が試しましたVagrantFile
追加Defaults env_keep = "SSH_AUTH_SOCKまでに
追加config.ssh.forward_agent = true:次の操作を実行して、SSHエージェント転送でこれを解決するためにon the vm

今、vagrant upはgitクローン部分に到達するとまだ失敗しますが、それ以降はvagrant provisionを実行するとパスします。私はこれがsshの設定がVMが起動され、再ロードされないときに設定されているためだと思います。

これらの2つの設定を調整した後にsshを再ロードしようとしましたが、

これを解決する方法はありますか?

ありがとうございました。

答えて

10

あなたが指摘したように、最初の実行中にsudoersを更新することは、シェフがすでにその時点までにsudoの下で実行されているため、実行には時間がかかりません。

代わりに、SSH_AUTH_SOCK環境を使用して更新するための適切なsshソケットを見つけるハッキーレシピを書きました。また、厳密なホスト鍵チェックも無効になり、最初のアウトバウンド接続が自動的に承認されます。

保存これが最初の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ファイルのアップデートでボックスを作成あなたの将来のVMはそれから離れています。

+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

複数のプロビジョニングをバゲント(同じ種類のものでも)で実行でき、各プロビジョニングは独自のSSH接続で実行されます。私は通常、この問題をシェルプロビジョナを使用して解決します。これは、Added Defaults env_keep = "SSH_AUTH_SOCK"をvmの/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 

私は唯一の追加シェルプロビジョナーで、シェフのプロビジョニングでこれをテストしていません...しかし、私が理解から、この作業をする必要がありますあなたのユースケースでも同じです。

0

ほとんどのベースボックスには、デフォルトの/安全でないsshキーが付属しています。 passwordless ssh auth for vagrantを有効にするのは簡単ですが、テストにのみ使用してください。