Terraform如何将新增资源动态传递给local-exec执行的脚本
Terraform传递新增资源给bash脚本的解决方案
你可以通过Terraform内置的变量拼接、集合运算能力,自动将资源参数传递给脚本,完全不需要硬编码参数,以下是两种常用场景的实现方式:
方案1:传递全量资源列表给脚本 (适合每次需要全量校验/处理所有资源的场景)
直接将var.resource_list转为空格分隔的字符串,拼接在脚本调用命令中即可:
- 修改
null_resource配置:
resource "null_resource" "mytest" { triggers = { run = timestamp() } provisioner "local-exec" { # 自动将所有资源名称作为参数传给脚本 command = "sh test.sh ${join(" ", var.resource_list)}" } }
- 脚本中直接接收参数遍历处理即可,示例
test.sh:
#!/bin/bash for res_name in "$@" do # 替换为你自己的资源操作逻辑 echo "正在处理Git仓库:${res_name}" done
- 提前在
variables.tf中声明变量:
variable "resource_list" { type = list(string) default = [] }
之后你只要在terraform.tfvars的resource_list里新增/删除资源,Terraform会自动把最新的全量列表传给脚本,不需要修改任何其他配置。
方案2:仅传递本次新增的资源 (适合仅需要处理增量、避免重复处理旧资源的场景)
通过Terraform内置的集合差集运算,自动对比本次和上一次应用的资源列表,只把新增的资源传给脚本:
- 完整配置示例:
# 声明变量 variable "resource_list" { type = list(string) default = [] } # 存储上一次应用的资源列表,记录在Terraform状态中 # Terraform版本低于1.4的话可以用null_resource替代terraform_data resource "terraform_data" "last_resource_list" { input = var.resource_list } # 计算本次新增的资源集合 locals { added_resources = setsubtract(toset(var.resource_list), toset(terraform_data.last_resource_list.input)) } resource "null_resource" "mytest" { triggers = { run = timestamp() } provisioner "local-exec" { # 仅传递本次新增的资源给脚本 command = "sh test.sh ${join(" ", local.added_resources)}" } }
- 脚本接收的参数就只有本次新增的资源,不需要做额外的去重/过滤逻辑。
内容的提问来源于stack exchange,提问作者mystack
相关产品推荐
相关产品推荐

