2016-11-30 11 views
1

Debianシェルにshスクリプトを作成して、別のOSに基づいてバグログファイルの作成を自動化したり、例えばStoragecontroller(Debianの場合はSata Controller、CentOSの場合はIDEコントローラ)を管理します。ディスクサイズを管理しようとすると、ボックスのデフォルトディスク(vmdk)を分析し、VirtualBoxネイティブ管理用のvdiに変換します。Vagrant RubyシェルからVirtualboxを管理するためのコード

問題は、VMデータを分析するためのRubyコードの使用です。

storagecontroller = %x[VBoxManage showvminfo $machinename'-'master --machinereadable | grep storagecontrollername0 | cut -d '=' -f 2 | sed 's/\"//g'] 
storagecontrollertype = %x[VBoxManage showvminfo $machinename'-'master --machinereadable | grep storagecontrollertype0 | cut -d '=' -f 2 | sed 's/\"//g'] 
storagecontrollerportcount = %x[VBoxManage showvminfo $machinename'-'master --machinereadable | grep storagecontrollerportcount0 | cut -d '=' -f 2 | sed 's/\"//g'] 

マシンが既に作成されたときにこのコードは動作し、私が使用:

vagrant reload 

が、私は

vagrant up 

をしようとすると、問題は、マシンのdoesntは、マシンのディレクトリに存在することです。私はシェルでエラーが発生します。 エラー:事がある

Message: Errno::ENOENT: No such file or directory @ dir_chdir - /root/VirtualBox VMs/projectname/machinename-master 

が、私はマシンのディスクをanalizeしたいのですが、マシンが作成された後ではなく放浪アップの文が呼び出されたときに、このRubyコードの幹部は、マシンの作成前に、私はこれを行う方法が必要ですシェルで。

これは私が生成したコードの一部です。

config.vm.define "machinename" do |machinename| 
     machinename.vm.box ="debian/contrib-jessie64" 
     machinename.vm.hostname = "machinename" 
     machinename.vm.provider "virtualbox" do |virtualbox| 
     virtualbox.memory = "2048" 
     virtualbox.cpus = "8" 
     virtualbox.name = "machinename-master" 
     virtualbox.customize [ 
     "modifyvm", :id, "--groups", "/projectname" 
     ] 
     storagecontroller = %x[VBoxManage showvminfo machinename'-'master --machinereadable | grep storagecontrollername0 | cut -d '=' -f 2 | sed 's/\"//g'] 
     path = File.join [ENV["HOME"], 'VirtualBox VMs/','projectname','machinename-master'] 
     Dir.chdir("#{path}") 
     storagecontroller = %x[VBoxManage showvminfo machinename'-'master --machinereadable | grep storagecontrollername0 | cut -d '=' -f 2 | sed 's/\"//g'] 
     storagecontroller.delete!("\n") 
     storagecontrollertype = %x[VBoxManage showvminfo machinename'-'master --machinereadable | grep storagecontrollertype0 | cut -d '=' -f 2 | sed 's/\"//g'] 
     storagecontrollertype.delete!("\n") 
     storagecontrollerportcount = %x[VBoxManage showvminfo machinename'-'master --machinereadable | grep storagecontrollerportcount0 | cut -d '=' -f 2 | sed 's/\"//g'] 
     storagecontrollerportcount.delete!("\n") 
     require "find" 
     file=Dir['*.vmdk'].first 
     if !File.exist?('/root/VirtualBox VMs/projectname/machinename-master/machinename-box.vdi') 
          virtualbox.customize [ 
            "storagectl", :id, 
            "--name", "#{storagecontroller}", 
            "--controller", "#{storagecontrollertype}", 
            "--portcount", "#{storagecontrollerportcount}", 
            "--hostiocache", "on" 
          ] 
          virtualbox.customize [ 
            "clonehd", "#{ENV["HOME"]}/VirtualBox VMs/projectname/#{virtualbox.name}/box-disk1.vmdk", 
             "#{ENV["HOME"]}/VirtualBox VMs/projectname/#{virtualbox.name}/ojocuidao-box.vdi", 
            "--format", "VDI" 
          ] 
          virtualbox.customize [ 
            "modifyhd", "#{ENV["HOME"]}/VirtualBox VMs/projectname/#{virtualbox.name}/machinename-box.vdi", 
            "--resize", 55 * 1024 
          ] 
          virtualbox.customize [ 
            "storageattach", :id, 
            "--storagectl", "#{storagecontroller}", 
            "--port", "0", 
            "--device", "0", 
            "--type", "hdd", 
            "--nonrotational", "on", 
            "--medium", "#{ENV["HOME"]}/VirtualBox VMs/projectname/#{virtualbox.name}/machinename-box.vdi" 
          ] 

マシンが作成される前に実行されているシェルを呼び出すためのルビーの文章なので、私はこの文章を見つけ、vagrantfileディスクボックスがダウンロードされ、VMが作成された直後の文章をカスタマイズする必要があります。

誰かが私を助けることができますか?

答えて

0

私は、この問題を文章引数を呼んでいる迷惑関数に読み替えることを修正しました。ルビーで

執筆:

if !(ARGV[0] == "up") 

は、シェルスクリプトから私はvagrant reloadと私はVagrantfileに追加引当金をexecし。

関連する問題