需求:基于单一模板与Makefile在账户专属目录生成TF文件
需求说明
基于现有以ami.template为输入的Makefile工作流,需调整实现:用唯一模板与Makefile从根目录出发,根据输入将TF文件生成到对应账户的专属文件夹中,目标目录结构示例如下:
demo-account-1 ami_demo-account-1_us-east-1.tf ami_demo-account-1_us-east-2.tf demo-account-2 ami_demo-account-2_eu-east-1.tf ami_demo-account-2_ap-south-1.tf
现有配置与文件内容
当前环境变量配置
export regions=us-east-1 ; export aws_account_alias=demo-account
现有Makefile内容
default, help:: @echo "USAGE:" @echo "then make all" all : preprocess preprocess: REGIONS="${regions}" ACCOUNTS="${aws_account_alias}" ./preprocess.sh ami.template
现有ami.template内容
provider "aws" { alias = "${REGION}" region = "${REGION}" } module "ami_${aws_account_alias}_${regions}" { count = contains(var.regions, "${REGION}") source = "./modules/ami/" providers = { aws = aws.${REGION} } }
现有preprocess.sh内容
#!/bin/bash for template in $* do BASE_NAME=$(basename "${template}" .tf.template) for region in ${REGIONS} do # shellcheck disable=SC2002 cat "${template}" | REGION=${region} envsubst > "${BASE_NAME}"."${region}".tf done done
修改实现方案
1. 调整preprocess.sh脚本
新增账户目录创建逻辑,修改输出文件的命名与路径,支持多账户多区域:
#!/bin/bash # 遍历传入的所有模板文件 for template in "$@" do # 获取模板基础名称(移除.tf.template后缀) BASE_NAME=$(basename "${template}" .tf.template) # 遍历每个目标账户(ACCOUNTS环境变量用空格分隔多账户) for account in ${ACCOUNTS} do # 创建账户专属目录,已存在则跳过 mkdir -p "${account}" # 遍历每个目标区域 for region in ${REGIONS} do # 替换模板变量,生成到对应账户目录下,文件名包含账户与区域标识 envsubst '${REGION},${aws_account_alias}' < "${template}" > "${account}/${BASE_NAME}_${account}_${region}.tf" done done done
2. 优化Makefile(支持多账户输入提示)
更新提示信息,明确支持多账户多区域的环境变量配置方式:
default, help:: @echo "USAGE:" @echo " export regions=\"us-east-1 us-east-2\"" @echo " export aws_account_alias=\"demo-account-1 demo-account-2\"" @echo " then make all" all : preprocess preprocess: REGIONS="${regions}" ACCOUNTS="${aws_account_alias}" ./preprocess.sh ami.template
3. 修正ami.template变量引用
将模块名称中的全局区域变量${regions}改为当前区域变量${REGION},确保命名准确:
provider "aws" { alias = "${REGION}" region = "${REGION}" } module "ami_${aws_account_alias}_${REGION}" { count = contains(var.regions, "${REGION}") source = "./modules/ami/" providers = { aws = aws.${REGION} } }
使用示例
- 设置环境变量(支持同时指定多账户多区域):
export regions="us-east-1 us-east-2 eu-east-1 ap-south-1" export aws_account_alias="demo-account-1 demo-account-2"
- 执行命令生成文件:
make all
内容的提问来源于stack exchange,提问作者Satyam Pandey
相关产品推荐
相关产品推荐

