【发布时间】:2021-03-26 15:18:58
【问题描述】:
所以 terraform 会生成一堆我感兴趣的输出。如何将这些值通过管道传输到环境变量或其他东西,以便我的脚本能够在有人运行 terraform apply 后获取它们?
【问题讨论】:
标签: bash terminal terraform hashicorp-vault
所以 terraform 会生成一堆我感兴趣的输出。如何将这些值通过管道传输到环境变量或其他东西,以便我的脚本能够在有人运行 terraform apply 后获取它们?
【问题讨论】:
标签: bash terminal terraform hashicorp-vault
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会将每个空格分隔的单词理解为一个单独的参数,而不是将整个值视为一个包含所有空白字符完好无损。)
【讨论】: