【问题标题】:Can I set terraform output to env variables?我可以将 terraform 输出设置为 env 变量吗?
【发布时间】:2021-03-26 15:18:58
【问题描述】:

所以 terraform 会生成一堆我感兴趣的输出。如何将这些值通过管道传输到环境变量或其他东西,以便我的脚本能够在有人运行 terraform apply 后获取它们?

【问题讨论】:

    标签: bash terminal terraform hashicorp-vault


    【解决方案1】:

    Terraform 不能直接修改调用它的 shell 的环境——通常,程序只能在启动子程序时修改自己的环境或设置新的环境——所以这里的任何解决方案都需要额外的一旦 terraform apply 返回,调用 shell 中的操作。

    您可以这样做的一种方法是将terraform output -json 的输出通过管道传输到可以解析 JSON、提取相关值的程序中,然后将它们作为一个或多个 shell 语句打印出来以设置环境变量。然后,您可以将该程序的结果作为 shell 脚本运行,例如在 bash 中使用 source 命令,将这些环境变量值合并到您当前的 shell 中。

    您可以使用任何您熟悉的编程语言编写这个转换程序。对于简单的情况,您可能希望使用 jq 编写一个简单的 shell 脚本,依靠其 @sh 转义模式来保证值的有效 shell 引用:

    terraform output -json | jq -r '@sh "export EXAMPLE1=\(.example1.value)\nexport EXAMPLE2=\(.example2.value)"'
    

    我使用以下测试 Terraform 配置进行了尝试:

    output "example1" {
      value = "hello"
    }
    
    output "example2" {
      value = <<EOT
    Hello world
    This is a multi-line string with 'quotes' in "it".
    EOT
    }
    

    应用该配置后,上面的命令产生以下输出:

    export EXAMPLE1='hello'
    export EXAMPLE2='Hello world
    This is a multi-line string with '\''quotes'\'' in "it".
    '
    

    我将输出重定向到文件 env.sh,然后将其加载到我的 shell 中以确认变量可用:

    $ terraform output -json | jq -r '@sh "export EXAMPLE1=\(.example1.value)\nexport EXAMPLE2=\(.example2.value)"' >env.sh
    $ source env.sh 
    $ echo $EXAMPLE1
    hello
    $ echo "$EXAMPLE2"
    Hello world
    This is a multi-line string with 'quotes' in "it".
    
    

    (请注意,对于EXAMPLE2,我将变量插值放在引号中,否则shell会将每个空格分隔的单词理解为一个单独的参数,而不是将整个值视为一个包含所有空白字符完好无损。)

    【讨论】:

    • 多么棒的答案。
    猜你喜欢
    • 2014-01-02
    • 2022-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2019-05-19
    • 2021-06-01
    相关资源
    最近更新 更多