如何在Terraform创建资源时使用Bash脚本的输出值?
解决方案
一、基于现有null_resource的实现方式
1. 修改脚本执行命令,将输出写入文件
让find_another_value.sh的输出写入临时文件,供Terraform读取。修改null_resource的local-exec命令:
resource "null_resource" "find_another_value" { provisioner "local-exec" { command = "shell_scripts/find_another_value.sh > ${path.module}/another_value.txt" interpreter = ["/bin/bash"] working_dir = path.module environment = { DAR = var.aws_dar RAD = var.aws_rad } } }
2. 在AWS资源中读取文件并建立依赖
修改some_aws_resource,读取文件内容作为another_key的值,并通过显式依赖确保AWS资源等待脚本执行完成:
resource "some_aws_resource" "resource_name" { name = var.resource_name role_name = var.role_name another_key = trimspace(file("${path.module}/another_value.txt")) # 去除输出中的换行/空格 # 显式声明依赖,确保脚本执行完成后再创建资源 depends_on = [null_resource.find_another_value] }
注意:脚本需只输出
another_value本身,不要包含额外日志或错误信息。若有错误输出,可在命令中重定向:shell_scripts/find_another_value.sh > ${path.module}/another_value.txt 2>/dev/null
二、更优实现:使用terraform_data替代null_resource
Terraform 1.4+版本推荐用terraform_data替代null_resource,它支持直接捕获脚本输出,无需临时文件,实现更简洁:
resource "terraform_data" "find_another_value" { provisioner "local-exec" { command = "shell_scripts/find_another_value.sh" interpreter = ["/bin/bash"] working_dir = path.module environment = { DAR = var.aws_dar RAD = var.aws_rad } capture_output = true # 开启输出捕获 } # 定义输出变量存储脚本结果 output "another_value" { value = trimspace(self.provisioners[0].stdout) } }
在AWS资源中直接引用该输出即可,Terraform会自动处理依赖顺序,无需额外声明:
resource "some_aws_resource" "resource_name" { name = var.resource_name role_name = var.role_name another_key = terraform_data.find_another_value.output.another_value }
三、关键注意事项
- 脚本必须保证输出仅包含目标值
another_value,避免多余内容导致参数错误。 - 若脚本执行可能失败,可添加
on_failure = continue或on_failure = abort配置控制错误处理逻辑。 trimspace函数用于清理输出中的换行符和空格,确保值符合AWS资源属性的格式要求。
内容的提问来源于stack exchange,提问作者user2175783
相关产品推荐
相关产品推荐

