私は、ユーザーが複数のサーバーで自動化されたタスクを実行できるようにするレールWebアプリケーションを持っています。私はrakeタスクを5分ごとに実行し(gemのたびに実行する)、実行する必要があるジョブをチェックし、適切なオプションを使用してサーバーを起動します。シェフのナイフをレイクから実行
私の問題は実際にシェフのナイフコマンドを実行していることです。私は現在:
sh %{bash -c -l 'cd ~/opscode/FTW && source ~/.rvm/scripts/rvm && rvm use system && knife rackspace server list'} do |ok, res|
if ! ok
puts "meh? (status = #{res.exitstatus})"
puts res
end
end
私はそこに私を得ます。それは私が次を取得し、問題なくしかし、ナイフの実行時に適切なgemset(システムの)に切り替わり:
Could not find multi_json-1.1.0 in any of the sources
Run `bundle install` to install missing gems.
私は...システムの宝石にインストールバンドラを持っていないので、私はかなり混乱しています。私のWebアプリケーションではmulti-json-1.1.0が必要です。私のシェフのインストールにはmulti_json 1.0.3が必要と思われるので、宝石の必要条件が混在しているようです。
のbashからのコマンドを実行する問題はない...それが唯一のナイフ一部
でレーキ内の任意の考えを失敗しましたか?
EDIT: mpapisの提案を使用して、私はRVMの宝石を使用し、すべてがIRBで素晴らしい作品。私は以下を行う
RVM.use! 'system'
env = RVM.current
env.shell_wrapper.run_command("cd /my/path/to/opscode/FTW && knife rackspace server list")
しかし、レールコンソールやレーキで同じコードを実行すると問題が発生します。 Railsコンソールは基本的に私のRVM.useを無視します!レーキは爆発する...それはバンドラー干渉と関係があるのだろうか?
解決策: mpapisは、特定のルビーバージョン内でコードを実行するための驚異的な宝石https://github.com/mpapis/rvm-withを作成しました。
RVM.with '1.8.7' do |r|
puts r.execute "unset RUBYOPT"
puts r.execute "cd /home/hunter/opscode/FTW && knife rackspace server list"
#puts r.execute "ruby --version"
end
次に使用する必要はありますか? %x {}、system、 ''を使ってコマンドを実行しようとしました。システムは同じエラーを出し、 ''と%x {}は同等です。 .rvm/gems/ruby-1.9.2-p290 @ global/gems/bundler-1.0.21/lib/bundler/spec_set.rb: 88: 'materialize ':どのソースからでもmulti_json-1.1.0を見つけることができませんでした(Bundler :: GemNotFound) –
rake経由でrvmを実行することはできませんか?それはむしろ不幸になるだろう –
rvm-rubyの統合には宝石がある=> https://github.com/wayneeseguin/rvm-gemもしいくつかの機能主義者が足りない場合は - それをフォークして追加するか、誰か他の誰かができるようにする後でそれを見て – mpapis