Терра-формная троичная операция

# #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, или ОС удаленной машины, которую вы создаете/обновляете.