10

在我的 Vagrantfile 中,我有一个这样的配置器:

config.vm.provision "reset", type: "shell", run: "always" do |s|
    s.privileged = false
    s.inline = "bash /path/to/my/reset/script.sh"
end

当正常配置 vagrant 时,它运行良好。但我想做的是设置一个配置器,它只在我手动调用它时运行。因此,如果我有以下供应商:

config.vm.provision "otherScript", type: "shell", run: "manual" do |s|
    s.privileged = false
    s.inline = "bash /path/to/my/other/script.sh"
end

我会用它来运行它vagrant provision --provision-with otherScript。我已经可以使用其他供应商做到这一点。但是我找不到一种方法来做到这一点,所以当我做这样的事情时,vagrant provision它会跳过任何运行设置为manual. 除了我可以使用“总是”之外,我在文档中找不到任何与它相关的内容。

我考虑过使用类似fabric 或invoke(python 3)的东西,但是我必须在我团队中的所有计算机上进行设置。我可以使用脚本进行设置,但我认为如果可能的话这可能会更容易。

有没有办法做到这一点?要设置仅在我手动调用时才运行的配置程序?

4

2 回答 2

7

当您需要一项复杂的任务在整个团队中可用、可重复和可重现时,手动/按需/显式配置程序是合理的需求,例如在需要时将数据库重置为干净的状态。

不幸的是,在 Vagrant 中仍然直接缺少这样的选项。有关功能请求,请参见 GitHub:https ://github.com/mitchellh/vagrant/issues/5355 。

幸运的是,通过 Vagrantfile 很容易解决这个限制。毕竟只是Ruby。

if ARGV.include? '--provision-with'
  config.vm.provision 'db-reset', type: 'shell', inline: 'mysql ...'
end
于 2016-07-08T09:54:17.583 回答
1

Vagrant 现在允许你传入run: "never"一个选项配置器。您仍然可以使用vagrant provision --provision-with <name>或传入--provision --provision-with <name>标志手动运行配置。

因此,对于此配置,您将运行vagrant provision --provision-with otherScript

config.vm.provision "otherScript", type: "shell", run: "never" do |s|
    s.privileged = false
    s.inline = "bash /path/to/my/other/script.sh"
end

注意:您必须手动指定供应商的名称,如果您不指定类型,则不能仅依赖给定的默认名称。例如,vagrant provision --provision-with shell不适用于此配置:

config.vm.provision "shell", run: "never" do |s|
    s.privileged = false
    s.inline = "bash script.sh"
end
于 2018-03-28T00:07:07.193 回答