Terraform三元运算



我有配置GCP VM的平台,它可以配置两个操作系统(windows &;Unix)。

变量os_distro=windows.

我需要windows-startup-script-ps1 = "${file("disk.ps1")}">仅当os_distro窗户是.

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

请引导我。由于

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

现在进入主题。你能澄清一下,这个meta_data_default块在哪里被定义?正如其他人在评论中指出的那样,在三元运算符之后使用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
}

或者,如果你想保持DRY(不要重复):

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
}
}
}

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

下面是我用来自动判断Terraform是在Windows上运行还是在Unix上运行的一个小技巧:
locals {
is_windows = dirname("/") == "\"
}

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

最新更新