Terraform中如何简化多次执行相同资源的重复代码编写
可复用的Terraform local-exec实现方案
你可以通过Terraform自带的模块封装或者批量资源生成能力实现逻辑复用,无需重复编写相同代码,以下是两种常用方案:
方案1:封装本地模块(推荐,适用大多数场景)
把重复的null_resource执行逻辑抽为独立本地模块,类似命令式编程的函数封装,仅需对外暴露命令、依赖项等可变参数即可。
- 首先在项目中创建模块目录
./modules/local_exec_runner,新增main.tf文件,写入以下代码:
variable "command" { type = string description = "需要执行的local-exec命令" } variable "dependencies" { type = list(any) default = [] description = "当前命令依赖的前置资源" } resource "null_resource" "runner" { depends_on = var.dependencies provisioner "local-exec" { command = var.command } triggers = { always_run = timestamp() } } output "runner_resource" { value = null_resource.runner }
- 根目录业务代码直接调用模块即可,简化后代码如下:
module "run_test_py_1" { source = "./modules/local_exec_runner" command = "python test.py" } module "run_run_py" { source = "./modules/local_exec_runner" command = "python run.py" dependencies = [module.run_test_py_1.runner_resource] } module "run_test_py_2" { source = "./modules/local_exec_runner" command = "python test.py" dependencies = [module.run_run_py.runner_resource] }
后续如果需要调整执行逻辑,比如添加环境变量、修改触发规则,仅需修改模块内的代码,所有调用位置自动生效,无需逐个调整。
方案2:批量生成资源(适用固定顺序的串行任务)
如果你的多个执行命令是按固定顺序串行运行的,可以直接通过for_each批量生成资源,无需多次调用模块:
locals { # 按执行顺序填写所有需要运行的命令 exec_commands = [ "python test.py", "python run.py", "python test.py" ] } resource "null_resource" "batch_exec" { for_each = toset(range(length(local.exec_commands))) # 自动配置前置依赖,保证按列表顺序执行 depends_on = each.value == 0 ? [] : [null_resource.batch_exec[each.value - 1]] provisioner "local-exec" { command = local.exec_commands[each.value] } triggers = { always_run = timestamp() } }
后续新增/修改命令仅需要调整local.exec_commands列表即可。
内容的提问来源于stack exchange,提问作者Sreevathsabr
相关产品推荐
相关产品推荐

