【问题标题】:Using output from bash script as variable within Terraform使用 bash 脚本的输出作为 Terraform 中的变量
【发布时间】:2019-08-30 17:11:37
【问题描述】:

我想知道是否有人可以为我指明正确的方向,我正在考虑在 Terraform 模块中将我们的 Kubernetes 版本表述为当前的硬编码。

在部署集群时,我们时不时会收到一条错误消息,指出我们的“编排版本”无效 - 这是由于 Azure 放弃了我们的 Kubernetes 版本...(我们每天都部署我们的 dev/uat 环境)

所以我想出了在我们的版本中使用变量的想法,这样我们就可以始终部署避免“无效的编排”错误。我根据需要编写了 bash 脚本;

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

但现在我希望使用 ^^^ 的输出作为我们每天部署的 Terraform 模块中的 Kubernetes 版本。

谁能指出我正确的方向?

我已经研究过在 docker 容器中使用 build-args。

【问题讨论】:

  • 你的意思是你想要命令替换,即。 variable=$( command | command | head -n1 )?

标签: bash docker terraform


【解决方案1】:

解决它的一种方法是将 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 版本。

【讨论】:

    【解决方案2】:

    您可以使用命令替换将命令的结果分配给变量。我冒昧地将您的文本处理清理为单个 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;请评论任何问题/疑虑。

    【讨论】:

      【解决方案3】:

      您可以通过 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-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" {}
      

      最后,您可以在 terraform 模块中使用 ${var.md_kubernetes_version}。

      注意:对于基线 kubernetes 版本,您可以选择在步骤 3 和 5 中为 terraform 变量声明添加默认值。

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        使用external 数据源: https://www.terraform.io/docs/providers/external/data_source.html.

        唯一的问题是输出和(可选的)输入必须是带有一些limitiations的有效Jsons。

        例子:

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

        【讨论】:

          猜你喜欢
          • 2021-11-11
          • 2020-07-10
          • 2019-11-19
          • 2021-10-03
          • 2010-10-22
          • 1970-01-01
          • 1970-01-01
          • 2012-08-16
          • 2020-08-05
          相关资源
          最近更新 更多