2016-05-17 10 views
0

returning a value from a provision script to vagrantの提案を使用して、ファイルに値を書き込む1つのプロビジョニングスクリプトを実行しています。私はRubyがこのファイルを開き、値が何であるかに応じて条件付きでVMをリロードしたいと考えています(vagrant plugin install vagrant-reloadを通してプラグインをインストールするとconfig.vm.provision :reload行が達成可能です)。次に、2番目のプロビジョニングスクリプトを実行します。実行中のプロビジョニングスクリプト間でRubyを使用して条件付きで迷惑メールVMを再ロードする

私の迷惑メールファイルで以下のコードを使ってRubyコマンドを実行する方法とタイミングが混乱しています:1番目のプロビジョニングスクリプトが完了すると、何も印刷せずにリロードするか、requirereboot.txt本当です)。

最初のプロビジョニングスクリプトの終了後にファイル処理コードを実行するには、どのような変更が必要ですか?

# -*- mode: ruby -*- 
# vi: set ft=ruby : 

$script1 = <<SCRIPT 
echo "Run this provisioner first to write a value to requiresreboot.txt... " 
start-process "C:\\...\\vagrant_provisioning_file1.bat" -wait 
SCRIPT 

$script2 = <<SCRIPT 
echo "Run this provisioner second... " 
start-process "C:\\...\\vagrant_provisioning_file2.bat" -wait 
SCRIPT 

Vagrant.configure(2) do |config| 

    # Other vagrant setup..... 
    # ........................ 

    File.new("requiresreboot.txt", "w+"); 

    # Enable provisioning with a shell script 1. 
    config.vm.provision "shell", inline: $script1 

    file = File.open("requiresreboot.txt", "r") 
    contents = file.read 
    if contents == "max_rearms_reached" 
    print "Cannot extend Windows 7 trial: maximum number of rearms reached." 
    elsif contents == "true" 
    # trigger reload (reboot to apply changes for Windows trial renewal) 
    print "Windows trial renewal is required" 
    config.vm.provision :reload 
    elsif contents == "false" 
    print "No reload required, continuing with provisioning..." 
    end 
    file.close 

    # Enable provisioning with a shell script 2. 
    config.vm.provision "shell", inline: $script2 

end 

答えて

0

あなたがホストマシンからスクリプトを実行したい場合、私はあなたがこのプラグインを使用することをrecomentう:

vagrant-host-shell

あなたがゲストマシンでスクリプトを実行したい場合、私はあなたを考えます

config.vm.provision :file, :source => "/path/ruby_script.rb", :destination => "/ruby_script.rb"

0123:ホストマシンに.RBファイルを作成し、ゲストマシンの内部でそれをコピーし、実行しなければならない、あなたはこれをやっていることを行うことができます

config.vm.provision :shell, :inline => "ruby /ruby_script.rb"

これを行うには、ゲストマシンにルビーがインストールされている必要があります。

+0

@ allesandro-caetanoどちらの場合でも、外部スクリプトからVMをどのようにリロードできますか?すなわち、 'config.vm.provision:reload'を実行してください。 –

+0

@kieran_pliシェルスクリプトを実行しているので、スクリプト内から' vagrant reload'を呼び出すことができます。ルビスクリプトを使用している場合は、 'IOを使用してサブプロセスを作成することができます。popen(「流行りのリロード」) ' –

0

私がいつ、どのようにRubyのコマンドは、私のvagrantfileに以下のコードを使用して を実行されているの混乱しています:第一プロビジョニング スクリプトが 何かを印刷したり、リロードせず、第2にまっすぐ1になり完了すると( requirereboot.txtの値がtrueです)。

あなたが見たように、スクリプトは行ごとに実行されています。たとえば、迷惑メールはすべての同期フォルダなどを実行し、次にプロビジョニングを実行します(プロビジョニングは書かれた順序で実行されますが、ファイルの先頭にあっても最初のものとして実行されるわけではありません)。それ。だから、すべてのプロビジョニングが行われる前に

file = File.open("requiresreboot.txt", "r") 
    contents = file.read 

は浮浪者によって運営されているとして持っているもの。内容が空であるため何も表示されません

okですが、あなたの質問には答えられません。どのように動作させることができますか?正直にはわかりませんが、vagrant trigger pluginで試してみましたが、コマンドは成功しませんでした。迷惑行為者は迷惑行為から呼び出されるのが好きではありません。

vagrant vbguest pluginは基本的に同じことをしますが、プラグインから実行するので、すべての変更設定にアクセスできます。本当にあなたがしたいことをしたい場合は、プラグインはおそらく最良の選択肢です。

関連する問題