在 Vagrant 中,我可以手动将供应商设置为仅 运行 吗?

In Vagrant, can I set a provisioner to only ever run manually?

在我的 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 时,运行没问题。但是我想做的是设置一个配置器,当我手动调用它时,它只有 运行s。因此,如果我有以下供应商:

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 的任何操作。除了可以使用 "always".

之外,我在相关文档中找不到任何内容

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

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

当您需要一项复杂的任务在整个团队中可用、可重复和可再现时,manual/on-demand/explicit provisioner 是合理的需求,例如在需要时将数据库重置为全新状态。

不幸的是,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

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