首页 > 解决方案 > 如何分离多机集群配置的阶段?

问题描述

假设我有 4 个 Vagrant 盒子。

3 个是相同配置的变体,例如 Consul,一个具有完全不同的配置,例如数据库。

我需要在三个类似配置的 Consul 虚拟机上运行一个配置步骤,略有不同。

然后,我需要对其中 1 个 Vault VM 运行配置步骤。

只有在其中一个 VM 上运行此预置步骤后,我才能在三个类似配置的 Vault VM 上成功运行下一个预置步骤(略有不同)。

我用多台机器通读了关于 Vagrant 的文档,循环遍历 VM 定义和配置参数。该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 日志,但我得到的相当于以下内容:

FIRST (1-Consul)
SECOND (由于缺少 3-Consul Quorum 而失败)
FINAL
FIRST
FINAL
FIRST
FINAL
DB

我正在寻找的更像是这样的:FIRST
FIRST
FIRST (3-Consul Quorum达到)
SECOND (API Call)
FINAL
FINAL
FINAL
DB

我还将使用 .yaml 文件和 Vagrantfile 层次结构进行研究。

这个答案似乎表明我正在寻找的东西不可能仅使用 Vagrantfile,但它来自 2 年前:https ://stackoverflow.com/a/25065243/2146138

这个答案起初看起来很有希望,但似乎主要集中在 Ansible 上:

Vagrant 多机配置

至少对我来说,引发这个问题的主要问题是,所有 3 台机器都需要为 Consul 集群“Quorum”配置。

在我们获得一个 3-Consul “Quorum” 后,需要针对 Consul Cluster 的 API 进行一次调用以对其进行 ACL。

在那次调用之后,其他服务的供应可以正常继续,它们可以在新初始化和 ACL 的 Consul 集群中注册。

不过,不管我遇到的具体问题是什么,我都对 Vagrant DSL 的多机控制流功能在这种情况下的功能感到好奇,因为我怀疑这种情况会再次出现。

标签: vagrantprovisioningconsulcontrol-flowvagrant-provision

解决方案


推荐阅读