在Vagrant中,我能否设置一个配置管理工具只能手动运行?

12

在我的Vagrantfile中,我有一个像这样的provisioner:

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

当使用标准方法来配置Vagrant时,它可以正常运行。但是我想做的是,设置一个只在手动调用时才运行的provisioner。因此,如果我有以下provisioner:

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) 的工具,但是我需要在团队中的所有计算机上都安装它们。我可以通过脚本来完成这个设置,但如果可能的话,我认为这可能更容易。

是否有办法实现这一点?可以设置一个配置管理工具,只有当我手动调用它时才会运行吗?


2
Shell provisioner 只支持两种运行模式:一次(默认)或始终,因此我认为你发布的问题的答案是“不可能”。你想要实现什么目标?也许有其他替代方案可以达到相同的结果。 - BrianC
我同意@BrianC的观点,如果你只需要手动运行它,那么通过SSH连接到服务器再执行脚本有什么问题呢? - ydaetskcoR
是的,这就是我认为的情况。我只是找不到其他相关文档。我已经在编写一个SSH脚本来运行我的脚本。谢谢。 - skift
2个回答

9

当你需要让一个复杂的任务在团队中可用、可重复、可复制时,就需要合法的手动/按需/明确提供者,比如在需要时将数据库重置为干净状态。

不幸的是,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,但我在工作中使用它,所以这会很方便。 - skift

2
现在,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接