将bash脚本的输出用作Terraform中的变量

时间:2019-04-09 11:55:50

标签: bash docker terraform

我想知道是否有人可以向我指出正确的方向,我正在考虑将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。

4 个答案:

答案 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模块

  1. 将bash脚本的输出分配给变量,例如kubernetes_version=$([your-bash-command])
  2. 在同一bash文件中,将此变量通过terraform CLI传递。看起来像这样:
terraform [action] -var "tf_kubernetes_version=$kubernetes_version" [some-other-options] [tf-root-directory]

action可以是plan/destroy/apply。访问this了解更多详细信息。

  1. 确保tf-root-目录包含变量声明
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" {}

最后,您可以在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