4

手動で実行bundle installして正常な状態に戻すことはできますが、PuppetにVagrantボックスをプロビジョニングさせると、これは2回目に発生します(最初に正常な出力が得られます)。

[default] Running provisioner: Vagrant::Provisioners::Puppet...
[default] Running Puppet with /tmp/vagrant-puppet/manifests/default.pp...
stdin: is not a tty
/opt/vagrant_ruby/lib/ruby/site_ruby/1.8/rubygems.rb:900:in `report_activate_error': Could not find RubyGem puppet (>= 0) (Gem::LoadError)
    from /opt/vagrant_ruby/lib/ruby/site_ruby/1.8/rubygems.rb:248:in `activate'
    from /opt/vagrant_ruby/lib/ruby/site_ruby/1.8/rubygems.rb:1276:in `gem'
    from /opt/vagrant_ruby/bin/puppet:18
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

私はどこにも人形の宝石を要求していません、それは私のGemfileにありません、そして私のマニフェストもそれを必要としません。人形の宝石が探しているのはなぜですか?このエラーを取り除くにはどうすればよいですか?

4

3 に答える 3

2

Puppet は、VM 上の VM によって実行されます。ユーザー vagrant および root に対して gem がまだインストールされていることを確認します。これは、デフォルトの Ruby バージョンの切り替えでもある可能性があります (システム vs rvm または rbenv 経由でインストールされたもの?)。

お役に立てれば。

于 2012-08-22T15:00:04.587 に答える
0

Puppet はシステム ruby​​ を使用して vagrant によって実行されることが期待されますが、RVM はデフォルトで、選択したインストール済み ruby​​ を使用する場合があります。これを回避するために、通常のログイン時にデフォルトのルビを使用しながら、これを実行しました(かなり醜いハック)。

vagrant ファイルで:

  # setup working dir only to exploit in below
  working_dir = '/home/vagrant/puppet'
  config.vm.provision :shell, :inline => "mkdir -p #{working_dir}"

  config.vm.provision "puppet" do |puppet|
    # [ ... Your config ... ] 

    # before puppet is run, vagrand `cd`s into the working directory, failing to escape it. 
    puppet.working_directory = "#{working_dir}; rvm use system || true"
  end

vagrant puppet プロバイダー ( https://github.com/mitchellh/vagrant/blob/master/plugins/provisioners/puppet/provisioner/puppet.rb#L154 ) のエスケープ バグ/機能により、これにより vagrant が

  1. デフォルトでロードおよび構成された rvm から開始します。
  2. 指定されたディレクトリに移動します
  3. システム ruby​​ に切り替えて、gem を再び見つけられるようにする
  4. RVM-rubie が干渉することなく、最初の実行のように puppet を実行します。
于 2014-08-12T18:50:25.617 に答える