14

vagrantを使用してVMを実行していて、Chefでプロビジョニングしています。手順の1つは、gitリポジトリのクローンを作成することですが、私のssh-key(ホストマシン上)にはパスフレーズがあります。

を実行するvagrant upと、プロセスはgit cloneステップで失敗し、次のエラーが発生します:(
Permission denied (publickey). fatal: The remote end hung up unexpectedly
キーがパスフレーズを使用してホストマシンに追加されました)

私は次のようにしてsshエージェント転送でこれを解決しようとしました: VMの
追加config.ssh.forward_agent = trueVagrantFile
追加Defaults env_keep = "SSH_AUTH_SOCK/etc/sudoers

さて、vagrant upgit cloneの部分に到達するとまだ失敗しますが、vagrant provisionその後実行すると合格します。これは、VMが起動され、リロードされないときにssh構成がセットアップされるためだと思います。

これらの2つの設定を調整した後、sshをリロードしようとしましたが、それは役に立ちませんでした。

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

ありがとう。

4

3 に答える 3

10

お気づきのように、最初の実行中に sudoers を更新するのは遅すぎて、その時点でシェフがすでに sudo で実行されているため、その実行に有益ではありません。

代わりに、使用する適切な 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 の更新が既に含まれているボックスを作成し、それを基に将来の VM を作成します。

于 2011-11-19T01:57:23.733 に答える
3

これはあなたが探している答えではないかもしれませんが、これを簡単に修正するには、パスフレーズなしで専用の展開 ssh キーを生成します。複数のアプリケーションに単一のキーを使用するよりも、個別の専用のデプロイ キーを好みます。

于 2011-11-11T19:08:57.573 に答える
2

Vagrant を使用して複数のプロビジョナーを (同じ種類であっても) 実行できます。各プロビジョナーは独自の SSH 接続で実行されます。通常、この問題は、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

私はこれをChefプロビジョナーでテストしておらず、追加のシェルプロビジョナーでのみテストしています...しかし、私が理解していることから、これはあなたのユースケースでも同じように機能するはずです.

于 2012-08-08T07:14:52.513 に答える