2016-05-17 47 views
0

使用returning a value from a provision script to vagrant中的建议,我正在运行一个配置脚本,它将值写入文件。我想Ruby打开这个文件并根据值是否有条件地重新加载虚拟机(通过vagrant plugin install vagrant-reload安装插件即可实现config.vm.provision :reload行)。然后我想要运行第二个供应脚本。使用Ruby在运行配置脚本之间有条件地重新加载流浪虚拟机

我对如何以及何时使用下面的代码在我的vagrantfile中执行Ruby命令感到困惑:当第一个provisioner脚本完成时,它直接进入第二个,而不打印任何东西或重新加载(requiresreboot.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

应该在主机中创建一个.rb文件,然后在客机中复制并执行它,你可以这样做:

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

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

要做到这一点,您需要安装在客机上的红宝石。

+0

@ allesandro-caetano无论哪种情况,我将如何从外部脚本中重新加载虚拟机?即执行'config.vm.provision:reload' –

+0

@kieran_pli,因为您正在运行shell脚本,您可以在脚本中调用'vagrant reload'。如果你使用的是Ruby脚本,你可以使用'IO来创建一个子进程。popen(“流浪重载”) –

0

我感到困惑的是如何以及何时Ruby的命令是使用下面的代码在我vagrantfile执行 :当第一个供应方 脚本完成它直接一个到第二个不打印 任何东西,或重装(中requiresreboot.txt中的值为true)。

正如您所看到的,脚本一直运行 - 不是逐行。例如vagrant会做所有同步文件夹等,然后运行规定(配置是按照他们编写的顺序运行的,但即使在文件的开头并不意味着它们将作为第一件事情运行),所以发生的事情是那。所以你有什么作为

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

是由流浪者运行之前,任何供应完成。所以什么也没有打印,因为内容是空的

确定但它不能回答你的问题,你怎么能使它的工作 - 老实说,我不知道,我试图用vagrant trigger plugin重新加载命令后,但没有成功的虚拟机。而流浪者不喜欢被流浪者的命令召唤。

vagrant vbguest插件基本上做同样的事情,你想做的,但他们从一个插件运行它,所以有访问所有vagrant配置。如果你真的想做你想做的事,插件可能是最好的选择。