在Makefile中使用sed替换Terraform输出变量到模板文件问题求解
Makefile中sed替换Terraform输出变量失败解决方案
问题根因
- sed命令使用单引号包裹替换规则,单引号会阻止Make对内部变量进行展开,也会阻止Shell解析变量,无论用
$$()还是${}写法,都会被当成普通字符串输出,无法替换为实际的桶名 jq默认输出带前后双引号的JSON格式字符串,没有加-r参数的情况下,拿到的存储桶、表名会自带冗余引号- 原sed命令末尾多了一个冗余的右括号
),存在语法错误
修复步骤
- 调整变量定义,添加
jq -r参数输出无引号的原始值
# 定义Make全局变量,:= 表示只执行一次shell命令避免重复调用 S3_BUCKET_NAME_STATE := $(shell terraform output -json | jq -r '.S3_Bucket.value') DYNAMODB_LOCK := $(shell terraform output -json | jq -r '.dynamo_db_lock.value')
- 调整sed命令,用双引号包裹替换规则,支持变量自动展开
如果存储桶名可能包含/字符,建议将sed的分隔符替换为#等不会出现在桶名中的符号,避免语法冲突:
sed "s#{{ BUCKET_NAME }}#$(S3_BUCKET_NAME_STATE)#g" variables.tf.template > variables.tf
注意:Makefile中目标下的命令行必须以制表符(Tab)开头,不能使用空格缩进,否则会触发Make语法错误。
完整可运行示例
.PHONY: generate-tf # 提前拉取Terraform输出变量 S3_BUCKET_NAME_STATE := $(shell terraform output -json | jq -r '.S3_Bucket.value') DYNAMODB_LOCK := $(shell terraform output -json | jq -r '.dynamo_db_lock.value') generate-tf: @echo "生成variables.tf文件..." @sed "s#{{ BUCKET_NAME }}#$(S3_BUCKET_NAME_STATE)#g" variables.tf.template > variables.tf @sed "s#{{ DYNAMODB_LOCK }}#$(DYNAMODB_LOCK)#g" -i variables.tf
执行make generate-tf即可完成替换。
内容的提问来源于stack exchange,提问作者David Villasmil
相关产品推荐
相关产品推荐

