【问题标题】:Using Ruby to conditionally reload a vagrant VM between running provisioning scripts使用 Ruby 在运行配置脚本之间有条件地重新加载 vagrant VM
【发布时间】:2016-05-17 16:31:39
【问题描述】:

使用returning a value from a provision script to vagrant 中的建议,我正在运行一个将值写入文件的配置脚本。我希望 Ruby 打开这个文件并根据值有条件地重新加载 VM(通过vagrant plugin install vagrant-reload 安装插件可以实现config.vm.provision :reload 行)。然后我想运行第二个配置脚本。

我对如何以及何时使用 vagrantfile 中的以下代码执行 Ruby 命令感到困惑:当第一个配置程序脚本完成时,它会直接执行一秒,而不打印任何内容或重新加载( 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

【问题讨论】:

    标签: ruby vagrant provisioning


    【解决方案1】:

    如果你想从主机运行脚本,我建议你使用这个插件:

    vagrant-host-shell

    如果你想在客户机中运行脚本,我认为你应该在主机中创建一个 .rb 文件,然后在客户机中复制并执行它,你可以这样做:

    config.vm.provision :file, :source =&gt; "/path/ruby_script.rb", :destination =&gt; "/ruby_script.rb"

    config.vm.provision :shell, :inline =&gt; "ruby /ruby_script.rb"

    为此,您需要在客户机上安装 ruby​​。

    【讨论】:

    • @allesandro-caetano 在这两种情况下,我如何能够从外部脚本重新加载 VM?即执行config.vm.provision :reload
    • @kieran_pli 因为您正在运行 shell 脚本,所以您可以从脚本内部调用 vagrant reload。如果您使用的是 ruby​​ 脚本,您可以使用 IO.popen("vagrant reload") 创建一个子进程
    【解决方案2】:

    我对 Ruby 命令的执行方式和时间感到困惑 在我的 vagrantfile 中使用以下代码:当第一个供应商 脚本完成它直接进入第二个而不打印 任何东西或重新加载(requiresreboot.txt 中的值为 true)。

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

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

    在任何配置完成之前由 vagrant 运行。所以没有打印,因为内容是空的

    好的,但它不能回答你的问题,你怎样才能让它工作 - 老实说,我不知道,我尝试使用 vagrant trigger plugin 在 up 命令后重新加载 VM,但没有成功。并且 vagrant 不喜欢被 vagrant 命令调用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 2017-02-17
      • 2023-03-16
      相关资源
      最近更新 更多