有没有像“pre vagrant up”这样的钩子?

时间:2014-01-31 09:40:09

标签: deployment vagrant

我正在尝试使用vagrant自动化我的开发盒。我需要与其他开发人员共享vagrant设置,因此我们需要确保在正常的vagrant up进程开始之前已满足某些边界条件。

在流浪汉中是否有任何钩子(如git,pre-commit或其他pre-*脚本)?提供脚本太晚了。

我目前的设置如下:

Vagrantfile
vagrant-templates/
vagrant-templates/apache.conf
vagrant-templates/...
sub-project1/
sub-project2/

我需要确定,子项目{1..n}存在,如果不存在,则应该有错误消息。

我更喜欢类似bash的解决方案,但我对其他解决方案持开放态度。

5 个答案:

答案 0 :(得分:25)

你可以尝试一下我写的这个Vagrant插件:

https://github.com/emyl/vagrant-triggers

安装完成后,您可以将您的Vagrant文​​件放入:

config.trigger.before :up, :execute => "..."

答案 1 :(得分:11)

一种选择是将逻辑直接放入Vagrantfile。然后它将在项目中的所有vagrant命令上执行。例如:

def ensure_sub_project(name)
  if !File.exists?(File.expand_path("../#{name}", __FILE__))
    # you could raise or do other ruby magic, or shell out (for a bash script)
    system('clone-the-project.sh', name)
  end
end

ensure_sub_project('some-project')
ensure_sub_project('other-project')

Vagrant.configure('2') do |config|
  # ...
end

答案 2 :(得分:5)

可以为vagrant编写自己的插件,并在machine_action_up上使用action_hook,例如:

require 'vagrant-YOURPLUGINNAME/YOURACTIONCLASS'

module VagrantPlugins
  module YOURPLUGINNAME
    class Plugin < Vagrant.plugin('2')
      name 'YOURPLUGINNAME'
      description <<-DESC
          Some description of your plugin
      DESC

      config(:YOURPLUGINNAME) do
        require_relative 'config'
        Config
      end

      action_hook(:YOURPLUGINNAME, :machine_action_up) do |hook|
        hook.prepend(YOURACTIONCLASS.METHOD)
      end
    end
  end
end

答案 3 :(得分:4)

另一个要签出的插件是vagrant-host-shell,只有在配置框时才会运行。只需在Vagrantfile中的其他提供者之前添加它:

config.vm.provision :host_shell do |shell|
  shell.inline = './clone-projects.sh'
  shell.abort_on_nonzero = true
end

答案 4 :(得分:2)

..添加到tmatilai的答案,您可以添加如下内容:

case ARGV[0]
when "provision", "up"
  system "./prepare.sh"
else
  # do nothing
end

进入您的Vagrantfile,以便它只能在特定命令上运行。