如何将Shell脚本输出解析为Terraform变量并用于S3桶配置
如何将Shell脚本输出解析为Terraform本地变量并用于S3 Bucket资源
你当前用null_resource的local-exec无法实现需求,因为provisioner是在资源创建阶段(apply)运行,而for_each需要在规划阶段(plan)就确定值。正确的做法是使用Terraform的external数据源,它能在plan阶段执行外部命令并返回可解析的JSON数据,从而将Shell输出转换为Terraform可用的变量。
1. 修改Shell脚本输出纯JSON
Terraform的external数据源要求外部命令输出严格的JSON格式,因此需要将原脚本的HCL格式输出改为JSON:
#!/bin/bash echo "{" echo " \"instance_config\": {" cluster="cluster1 cluster2" cluster1_con="con1 con2 con3" cluster2_con="con4 con5 con6" # 处理集群间的逗号分隔 first_cluster=true for i in $cluster; do if [ "$first_cluster" = true ]; then first_cluster=false else echo "," fi echo " \"$i\": [" con_var="${i}_con" con_values="${!con_var}" # 处理节点间的逗号分隔 first_node=true for node in $con_values; do if [ "$first_node" = true ]; then first_node=false else echo "," fi echo " \"$node\"" done echo " ]" done echo " }" echo "}"
2. 配置Terraform外部数据源与资源
通过external数据源执行脚本,解析JSON输出为本地变量,再用于S3 Bucket资源:
# 执行Shell脚本并获取JSON输出 data "external" "instance_config" { program = ["bash", "${path.module}/shell_3.sh"] } # 将JSON解析为Terraform可识别的Map类型 locals { instance_config = jsondecode(data.external.instance_config.result).instance_config } # 基于本地变量批量创建S3 Buckets resource "aws_s3_bucket" "buckets" { for_each = local.instance_config bucket = each.key acl = "private" }
关键说明
external数据源在Terraform plan阶段执行命令,确保for_each能提前获取到有效值,这是null_resource的local-exec做不到的。jsondecode函数将外部命令返回的JSON字符串转换为Terraform原生的Map结构,直接满足for_each的参数要求。
内容的提问来源于stack exchange,提问作者Nabob
相关产品推荐
相关产品推荐

