# #google-cloud-platform #terraform #terraform-provider-gcp
Вопрос:
У меня есть terraform для подготовки виртуальной машины GCP, и это может быть как операционная система (Windows и Unix).
У меня есть переменная os_distro=windows.
Мне нужен сценарий запуска Windows-ps1 = «${файл(«диск.ps1″)}» внутри метаданных, ТОЛЬКО если os_distro—это windows.
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, но не требуется windows-startup-script-ps1
, когда os_distro==unix
Пожалуйста, веди меня. Спасибо
Комментарии:
1. Попробуйте заменить
""
пустую строку наnull
.2. Спасибо, Марк. это работает. Но мое требование заключается в том, что если это UNIX, мне не нужна переменная windows-startup-script-ps1 , потому что эта переменная предназначена только для Windows, запускающей powershell при запуске. Есть идеи ?
3. Делает ли установка его так, чтобы
null
он не удалялся?4. Это не значит, что нужно иметь
null
что-то, кроме окон. означает, что эта переменная должна быть определена только для Windows, если для определенной переменной не требуется другая.5.Посмотрите, что
null
здесь говорится в документах по терраформированию. Это считается отсутствием настройки. Это означает, что значение не определено.
Ответ №1:
Во-первых, обратите внимание, что ваш синтаксис интерполяции устарел. "${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
}
Или, если вы хотите сохранить его СУХИМ (не повторяйтесь):
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, или ОС удаленной машины, которую вы создаете/обновляете.