如何通过Terraform CLI或Bash检索模块中的local值?
解决方案:获取Terraform分散的local值及定义位置
一、用Terraform CLI结合JSON解析看计算后的值
Terraform没有直接列出所有local值的命令,但可以通过计划文件的JSON输出提取相关信息:
生成计划JSON文件
先初始化模块,生成并导出计划的JSON格式:terraform init terraform plan -out=tfplan terraform show -json tfplan > tfplan.json用jq提取local信息
用jq工具解析JSON,列出所有local变量名、计算后的值,以及可能的来源文件:jq '.planned_values.root_module.locals | to_entries[] | {name: .key, value: .value, source_file: try(.value."#ref".source, "unknown")}' tfplan.json注:如果local是直接赋值而非引用其他资源,
source_file会显示unknown,但变量名和值是准确的。
二、用Bash脚本定位local的定义位置
如果要找local值在哪个文件、哪一行定义的,用以下方法:
1. 列出所有local变量及所在文件
把下面的代码保存为list_locals.sh,赋予执行权限后运行,就能遍历所有.tf文件,提取locals块里的变量名:
#!/bin/bash for file in $(find . -name "*.tf" -type f); do echo "=== $file ===" awk ' /locals\s*{/ { in_locals=1; next } in_locals && /}/ { in_locals=0; next } in_locals && /=/ { gsub(/^[ \t]+/, "", $0) split($0, arr, "=") gsub(/[ \t]+$/, "", arr[1]) print "- " arr[1] } ' "$file" done
执行命令:
chmod +x list_locals.sh && ./list_locals.sh
2. 搜索特定local变量的定义
比如要找db_instance_name这个local的定义位置,用这个命令:
grep -rn --include="*.tf" -B2 -A2 "^[ \t]*db_instance_name[ \t]*=" .
参数说明:
-r:递归搜索所有子目录-n:显示匹配行的行号--include="*.tf":只处理.tf文件-B2 -A2:显示匹配行前后各2行的上下文(可根据需要调整数字)- 正则部分确保只匹配变量定义的赋值行,不会误抓到引用该变量的地方
三、注意事项
- 要看local的最终计算值,用Terraform+jq的方法;要找定义位置,用Bash脚本/grep的方法。
- jq工具需要提前安装,Linux系统可以用
apt install jq或yum install jq安装。
内容的提问来源于stack exchange,提问作者tayken
相关产品推荐
相关产品推荐

