Terraform如何确保locals块在local-exec资源执行完成后再运行
解决方案
方案1:使用external数据源(官方推荐,无需中间文件)
Terraform内置的external数据源专门用于调用外部程序获取结构化返回值,天然满足「先执行程序、后读取结果」的执行顺序,完全避免显式依赖配置和中间文件读写。
要求你的myscript.py直接将JSON结果输出到标准输出(无需重定向到文件),示例配置如下:
data "external" "get_data_plane_ip" { # 指定要执行的命令,按数组格式拆分参数 program = ["python", "${path.module}/myscript.py"] # 若需要每次apply都强制重新执行脚本,添加该行(和原triggers逻辑一致) query = { always_run = timestamp() } } locals { # 直接取external数据源的返回结果,已经是解析后的结构化对象,无需手动jsondecode var1 = data.external.get_data_plane_ip.result }
方案2:保留原生成文件逻辑,用local_file数据源中转
如果你的脚本逻辑不能修改,必须先生成output.json文件再读取,可以用支持depends_on参数的local_file数据源做中转,建立执行顺序依赖:
resource "null_resource" "get_data_plane_ip" { provisioner "local-exec" { command = "python myscript.py > ${path.module}/output.json" } triggers = { always_run = timestamp() } } # 用local_file数据源读取文件,显式指定依赖null_resource执行完成后再读 data "local_file" "output_json" { filename = "${path.module}/output.json" depends_on = [null_resource.get_data_plane_ip] } locals { var1 = jsondecode(data.local_file.output_json.content) }
注意事项
- 所有文件路径建议用
${path.module}拼接,避免Terraform工作目录变化导致找不到文件的问题 external数据源要求外部程序的标准输出必须是合法JSON,不能包含日志、调试等额外输出
内容的提问来源于stack exchange,提问作者Hound
相关产品推荐
相关产品推荐

