我想知道是否有人可以向我指出正确的方向,我正在考虑将Terraform模块中的Kubernetes版本作为目前的硬编码进行语言化。
每时每刻,我们都会收到一条错误消息,说在部署集群时“编排版本”无效-这是由于Azure删除了Kubernetes版本...(我们每天部署dev / uat envs)
因此,我想到了在我们的版本中使用变量的想法,这样我们就可以始终进行部署,避免出现“无效编排”错误。我根据需要编写了bash脚本;
az aks get-versions --location westeurope --query 'orchestrators' -o tsv | awk '{print $3}' | tail -2 | head -n 1
但是现在我希望使用^^^的输出作为我们每天部署的Terraform模块中的Kubernetes版本。
有人能指出我正确的方向吗?
我看过在docker容器中使用build-args。
答案 0 :(得分:0)
一种解决方法是将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_version
属性创建kubernetes版本。
答案 1 :(得分:0)
您可以使用“命令替换”将命令的结果分配给变量。我冒昧地将您的文本处理整理为一个awk
语句。以下Bash应该将az
输出的第三列的倒数第二个值分配给变量kubernetes_version
。
kubernetes_version=$(
az aks get-versions -o tsv \
--location westeurope --query orchestrators \
|awk '{penult=ult; ult=$3} END{printf penult}'
)
未经测试,因为我不使用Azure;请评论任何问题/疑虑。
答案 2 :(得分:0)
您可以轻松地通过Terraform CLI将bash脚本输出传递到terraform模块
kubernetes_version=$([your-bash-command])
terraform [action] -var "tf_kubernetes_version=$kubernetes_version" [some-other-options] [tf-root-directory]
action
可以是plan/destroy/apply
。访问this了解更多详细信息。
variable "tf_kubernetes_version" {}
module "kubernetes_module" {
source = "[tf-module-directory]"
md_kubernetes = "${var.tf_kubernetes_version}"
}
variable "md_kubernetes_version" {}
最后,您可以在terraform模块中使用$ {var.md_kubernetes_version}。
注意:对于基线kubernetes版本,您可以选择在步骤3和5中为terraform变量声明添加默认值。
希望这会有所帮助!
答案 3 :(得分:0)
使用onGlobalLayout
数据源:
https://www.terraform.io/docs/providers/external/data_source.html。
唯一的麻烦是输出和(可选)输入必须是带有某些limitiations的有效Jsons。
示例:
external