假设我有 4 个 Vagrant 盒子。
3 种是相同配置的变体,例如 Consul,而一种具有完全不同的配置,例如数据库。
我需要在三个配置相似的 Consul VM 上运行一个略有不同的配置步骤。
然后,我需要针对其中 1 个 Vault VM 运行配置步骤。
只有在其中 1 个虚拟机上运行此配置步骤后,我才能在三个配置相似的 Vault 虚拟机上成功运行下一个配置步骤(略有不同)。
我已经通读了 Vagrant 的多台机器文档、循环虚拟机定义和配置参数。这preserve_order: true
参数对我不起作用,至少不是我使用它的方式。
到目前为止,我一直在尝试匿名以保护有罪者:
~ $cat Hark_TisAVagrant
Vagrant.configure("2") do |config|
## 1.
## Do This on 3 VMs
(1..3).each do |i|
config.vm.define "node-#{i}" do |node|
node.vm.provision "shell",
inline: "echo FIRST from node #{i}"
node.vm.provider "docker" do |d|
d.image = "consul"
end
end
end
## 2.
## Afterwards, do this on one VM from that set
node3.vm.provision "then-this",
type: "shell",
preserve_order: true,
inline: "echo SECOND from node3!"
## 3.
## Finally, on all 3, do this
(1..3).each do |i|
config.vm.define "node-#{i}" do |node|
node.vm.provision "shell",
inline: "echo FINAL from node #{i}"
end
end
## 4.
## On the side, no order needed
config.vm.define "db" do |db|
db.vm.provision "shell", inline: "echo an irrelevant dbtard meme-ing in the peanut gallery"
db.vm.provider "docker" do |d|
d.image = "postgres"
end
end
end
我不会给你大量的 Vagrant 日志,但我得到的相当于以下内容:
第一(1-领事)
第二(由于缺乏 3 名领事法定人数而失败)
FINAL
FIRST
FINAL
FIRST
FINAL
DB
我正在寻找的更像是这样的:
第一的
FIRST
第一(达到 3 名领事法定人数)
第二(API 调用)
FINAL
FINAL
FINAL
DB
我还将研究如何使用 .yaml 文件和 Vagrantfile 层次结构来实现此目的。
这个答案似乎表明我正在寻找的内容不可能仅使用 Vagrantfile 来实现,但它来自 2 年前:https://stackoverflow.com/a/25065243/2146138 https://stackoverflow.com/a/25065243/2146138
这个答案一开始看起来很有希望,但似乎主要关注 Ansible:
Vagrant 多机配置 https://stackoverflow.com/questions/34444506/vagrant-multi-machine-provisioning
至少对我来说,引发这个问题的主要问题是所有 3 台机器都需要为 Consul 集群“Quorum”进行配置。
在我们获得 3-Consul“Quorum”后,需要针对 Consul 集群的 API 进行一次调用以对其进行 ACL。
在该调用之后,其他服务的配置可以正常继续,并且它们可以在新初始化和 ACL 的 Consul 集群中注册。
不管我的具体激励问题如何,我对 Vagrant DSL 的多机控制流功能在此类情况下的功能感到好奇,因为我怀疑这种情况会再次出现。