ユーザーが複数のサーバーで自動化されたタスクを実行できるようにする Rails Web アプリケーションがあります。5 分ごと (gem の場合) に rake タスクを実行し、実行する必要があるジョブをチェックし、適切なオプションでサーバーをスピンアップするように配線しました。
私の問題は、実際にシェフのナイフコマンドを実行することです。私は現在:
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.
システムgemにバンドラーがインストールされていないので、かなり混乱しています。私の Web アプリケーションには multi-json-1.1.0 が必要です。私のシェフのインストールには multi_json 1.0.3 が必要なようですので、宝石の要件に混乱があるようです。
コマンドはbashから問題なく実行されます...ナイフ部分のレーキでのみ失敗します
何かご意見は?
編集: mpapis の提案を使用して、RVM gem を使用しましたが、すべてが IRB でうまく機能します。私は次のことをします
RVM.use! 'system'
env = RVM.current
env.shell_wrapper.run_command("cd /my/path/to/opscode/FTW && knife rackspace server list")
ただし、Rails コンソールまたは rake から同じコードを実行すると、問題が発生します。Rails コンソールは基本的に私の RVM.use を無視します! そしてレーキが爆発します...バンドラーの干渉と関係がありますか?
解決策: mpapisは、特定の Ruby バージョン内でコードを実行できる驚異的な gem 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