Использование вывода из скрипта bash в качестве переменной в Terraform

#bash #docker #terraform

#bash #docker #terraform

Вопрос:

Мне было интересно, может ли кто-нибудь указать мне правильное направление, я смотрю на вербализацию нашей версии Kubernetes в нашем модуле Terraform, поскольку в настоящее время она жестко запрограммирована.

Время от времени мы получаем сообщение об ошибке, в котором говорится, что наша «версия оркестровки» недействительна при развертывании нашего кластера — это связано с тем, что Azure удаляет нашу версию Kubernetes… (Мы ежедневно развертываем наши среды разработки / uat)

Итак, мне пришла в голову идея использовать переменную для нашей версии, чтобы мы всегда могли развернуть, избегая ошибки «недопустимой оркестровки». Я написал сценарий bash для того, что мне нужно;

 az aks get-versions --location westeurope --query 'orchestrators' -o tsv | awk '{print $3}' | tail -2 | head -n 1
  

Но теперь я хочу использовать вывод из ^^^ для использования в качестве нашей версии Kubernetes в нашем модуле Terraform, который мы развертываем ежедневно.

Может кто-нибудь указать мне правильное направление?

Я рассмотрел использование аргументов сборки в контейнере docker.

Комментарии:

1. Вы имеете в виду, что хотите подстановку команд, т.Е.. variable=$( command | command | head -n1 ) ?

Ответ №1:

Используйте external источник данных: https://www.terraform.io/docs/providers/external/data_source.html .

Единственная проблема заключается в том, что выходные и (необязательно) входные данные должны быть допустимыми Json с некоторыми ограничениями.

Пример:

 data "external" "myjson" {
  program = [
    "${path.module}/scriptWhichReturnsJson.sh",
  ]
  result {

  }
}

...
resource ...  {
  value = data.external.myjson.property
}

  

Ответ №2:

Один из способов решить эту проблему — сохранить вывод bash-скрипта в файл и использовать локального провайдера для чтения этого файла:

 data "local_file" "foo" {
    filename = "${path.module}/foo.bar"
}
  

и затем вы можете использовать содержимое файла через ${local_file.foo.content} .

Но я бы проверил, какие источники данных доступны у поставщика Azure. Вы могли бы использовать ресурс данных azurem_kubernetes_cluster для получения kubernetes_version текущего развернутого кластера:

 data "azurerm_kubernetes_cluster" "test" {
  name                = "myakscluster"
  resource_group_name = "my-example-resource-group"
}
  

Что создает версию kubernetes через kubernetes_version атрибут.

Ответ №3:

Вы можете использовать подстановку команд, чтобы присвоить результат команды переменной. Я взял на себя смелость очистить вашу обработку текста в одном awk операторе. Следующий Bash должен присвоить переменной предпоследнее значение третьего столбца вашего az вывода kubernetes_version .

 kubernetes_version=$(
  az aks get-versions -o tsv 
    --location westeurope --query orchestrators 
      |awk '{penult=u< ult=$3} END{printf penult}'
)
  

Это не проверено, поскольку я не использую Azure; пожалуйста, прокомментируйте любые вопросы / проблемы.

Ответ №4:

Вы можете легко передать вывод скрипта bash в модуль terraform через Terraform CLI

  1. Назначьте выходные данные bash-скрипта в переменную, скажем, kubernetes_version=$([your-bash-command])
  2. В том же файле bash передайте эту переменную через интерфейс командной строки terraform. Это выглядит примерно так:
 terraform [action] -var "tf_kubernetes_version=$kubernetes_version" [some-other-options] [tf-root-directory]
  

action Может быть plan/destroy/apply . Посетите это для получения дополнительной информации.

  1. Убедитесь, что tf-root-directory содержит объявление переменной
 variable "tf_kubernetes_version" {}
  
  1. Передайте переменную tf_kubernetes_version из корня в модуль
 module "kubernetes_module" {
   source = "[tf-module-directory]"
   md_kubernetes = "${var.tf_kubernetes_version}"
}
  
  1. Убедитесь, что tf-module-directory содержит объявление переменной
 variable "md_kubernetes_version" {}
  

Наконец, вы можете использовать ${var.md_kubernetes_version} в вашем модуле terraform.

Примечание: вы можете добавить значение по умолчанию для объявления переменной terraform на шагах 3 и 5 для базовой версии kubernetes.

Надеюсь, это поможет!