【问题标题】:Terraform ternary operationTerraform 三元运算
【发布时间】:2021-11-28 15:27:45
【问题描述】:

我有用于配置 GCP 虚拟机的 terraform,它可以配置两个操作系统(windows 和 Unix)。

我有变量 os_distro=windows

仅当 os_distrowindows 时,我才需要 windows-startup-script-ps1 = "${file("disk.ps1")}" 在元数据中

  meta_data_default = {
    google-monitoring-enable = 1
    google-logging-enable    = 1
    windows-startup-script-ps1 = var.os_distro == "windows" ? "${file("disk.ps1")}" : ""
  }

上述块在 os_distro==windows 时有效,但在 os_distro==unix

时不需要 windows-startup-script-ps1

请指导我。谢谢

【问题讨论】:

  • 尝试用null替换""空字符串。
  • 谢谢马克。有用。但我的要求是如果它是 UNIX,我不想要 windows-startup-script-ps1 变量,因为这个变量仅适用于在启动时运行 powershell 的 Windows。有什么想法吗?
  • 是否将其设置为null 不会删除它?
  • 这并不意味着除了windows之外有null。意思是,这个变量应该只为windows定义,如果是其他,不需要定义变量。
  • 查看 Terraform 文档对 null here 的评价。它被认为是没有设置。这意味着该值未定义。

标签: google-cloud-platform terraform terraform-provider-gcp


【解决方案1】:

首先,请注意您的插值语法已被弃用。 "${file("disk.ps1")}" 应改为 file("disk.ps1")

现在是主要话题。您能否澄清一下,这个meta_data_default 块在哪里定义?正如其他人在 cmets 中指出的那样,在三元运算符 should 工作之后使用 null 而不是 ""。但是,如果由于某种原因它没有,那么您可以做两件事。

如果meta_data_default是一个输入参数,你可以在整个对象周围放一个三元组:

meta_data_default = var.os_distro == "windows" ? {
    google-monitoring-enable = 1
    google-logging-enable    = 1
    windows-startup-script-ps1 = file("disk.ps1")
  } : {
    google-monitoring-enable = 1
    google-logging-enable    = 1
  }

或者,如果你想让它保持干燥(不要重复自己):

meta_data_default = merge(
  {
    google-monitoring-enable = 1
    google-logging-enable    = 1
  }, 
  var.os_distro == "windows" ? 
    {
      windows-startup-script-ps1 = file("disk.ps1")
    } : 
    {}
)

如果meta_data_default 是资源中的一个块,您可以使用dynamic 语句:

resource "some_google_resource" "myresource" {
  ...

  dynamic "meta_data_default" {
    count = var.os_distro == "windows" ? 1 : 0
    content {
      google-monitoring-enable = 1
      google-logging-enable    = 1
      windows-startup-script-ps1 = file("disk.ps1")
    }
  }

  dynamic "meta_data_default" {
    count = var.os_distro == "windows" ? 0 : 1
    content {
      google-monitoring-enable = 1
      google-logging-enable    = 1
    }
  }
}

这将创建meta_data_default 块的第一个样式(带有windows-startup-script-ps1 字段),如果它在Windows 上,或者第二个样式(没有那个字段)如果它在Unix 上。

顺便说一句,这是我经常使用的一个技巧,用于自动确定 Terraform 是在 Windows 还是 Unix 上运行:

locals {
  is_windows = dirname("/") == "\\"
}

如果操作系统使用反斜杠作为路径分隔符,则为 windows,否则为基于 unix。这可能对您有用也可能没有用,因为我不确定您的 os_distro 变量是否应该代表 Terraform 正在运行的操作系统,或者您正在创建/更新的远程计算机的操作系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多