地形切换?

kra*_*lax 5 terraform

我有一个关于 Terraform 的问题。

我已经设置了一些文件,并且可以在 vSphere 上使用它很好地创建虚拟机。但在现在的公司:

  • 我们有两个可以部署 VM 的集群
  • 我们还有两个可以加入 VM 的 AD 域

我已经编写了几段代码,并且运行良好,但问题是每次我想从这段代码部署 VM 到 clusterA(网络为 1.2.3.4/24)时,网关为1.2.3.1等等,然后我将它们作为默认值放入代码中。然后,当我部署到 clusterB 时,我需要更新所有这些变量,例如。网络为 1.2.4.4/24,网关为 1.2.4.1,依此类推。能否以某种方式引入开关逻辑,例如:

  • 如果变量(从控制台读取,类似于 PS-s Read-Host)是“foo”,则使用此集合或变量。如果该变量是“bar”,请使用一组不同的变量。如果用户输入的变量既不是“foo”也不是“bar”,那么会抛出错误吗?

我知道这不是最好的方法,而且由于我更精通 PowerShell,如果 Terraform 不支持 switch 语句(或者我红色),我最终会做一个解决方法(编写一个需要模板文件的 PS 脚本) ,进行切换,并根据用户的选择在运行 terraform plan / apply 之前替换模板文件中的变量),但我更愿意将所有内容保留在 Terraform 中...

我的起始代码在这里(抱歉有很多评论,它是为了给更初级/不熟悉 TF 团队成员的,所以需要啰嗦......): https: //code.prkr.li/ 4W4RsYTEm3

举个例子:

    variable "vm_to_clone" {
  description = "Enter the name of the vM that we will clone:"
  # ! THIS IS THE VM THAT YOU ARE CLONING 
  # * changeme ->
  # default = "bnw_2019_gui" # * uncomment this line for deploying in BN
  default = "alw_2019_gui" # * uncomment this line for deploying in AL
}
Run Code Online (Sandbox Code Playgroud)
  • 目前,这将使用我在“ALW”集群中设置的模板。要使用“BNW”集群的模板,我需要注释掉“bnw_2019_gui”行并注释“alw_2019_gui”行。(或者当然可以通过 terraform 计划/应用给出压倒一切的值)。但我更喜欢根据所选集群进行切换。

有什么建议吗?

谢谢

Mar*_*cin 22

TF本身switch不支持,但您可以使用常规地图来表示要使用的内容switch(如果我正确理解您的用例)。

因此,您不必将所有变量分开,而是可以map使用键foo和将它们捆绑到一个变量中bar。您可以从控制台提供要使用哪个密钥。

粗略的例子:


variable "cluster" {
}


variable "setup" {

  default = { 
     "foo" = {
        "vm_to_clone" = "bnw_2019_gui"
        "vm_folder" = "BN-ALL-SIMPLIVITY-VMS"
        # and the rest
      },
     "bar" = {
        "vm_to_clone" = "alw_2019_gui"
        "vm_folder" = "AL-ALL-SIMPLIVITY-VMS"
        # and the rest
      },
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,根据您的clusterfoobar),您将在代码的其余部分中使用不同的变量值:

data "vsphere_virtual_machine" "template_vm" {
  name          = var.setup[var.cluster].vm_to_clone
  datacenter_id = data.vsphere_datacenter.target_datacenter.id
}

# and similarly for the rest.
Run Code Online (Sandbox Code Playgroud)

  • @krapulax 如果这“正是我正在寻找的东西”,那么接受答案将不胜感激。 (3认同)