我有配置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上,则创建第二种样式(没有该字段)。
locals {
is_windows = dirname("/") == "\"
}
如果操作系统使用反斜杠作为路径分隔符,它是windows,否则它是基于unix的。这可能对你有用,也可能没用,因为我不确定你的os_distro
变量是否应该代表Terraform运行的操作系统,或者你正在创建/更新的远程机器的操作系统。