#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
- Назначьте выходные данные bash-скрипта в переменную, скажем,
kubernetes_version=$([your-bash-command])
- В том же файле bash передайте эту переменную через интерфейс командной строки terraform. Это выглядит примерно так:
terraform [action] -var "tf_kubernetes_version=$kubernetes_version" [some-other-options] [tf-root-directory]
action
Может быть plan/destroy/apply
. Посетите это для получения дополнительной информации.
- Убедитесь, что tf-root-directory содержит объявление переменной
variable "tf_kubernetes_version" {}
- Передайте переменную tf_kubernetes_version из корня в модуль
module "kubernetes_module" {
source = "[tf-module-directory]"
md_kubernetes = "${var.tf_kubernetes_version}"
}
- Убедитесь, что tf-module-directory содержит объявление переменной
variable "md_kubernetes_version" {}
Наконец, вы можете использовать ${var.md_kubernetes_version} в вашем модуле terraform.
Примечание: вы можете добавить значение по умолчанию для объявления переменной terraform на шагах 3 и 5 для базовой версии kubernetes.
Надеюсь, это поможет!