Terraform如何为3个AWS Launch Template的userdata传递不同参数的bash脚本
方案实现
问题根源
你当前只声明了1个template_file数据源,所有Launch Template都复用同一个渲染后的结果,因此变量值完全一致。
最优实现方案
优先使用Terraform内置的templatefile函数(官方已推荐淘汰旧版template_file数据源),不需要额外声明数据源,根据Launch Template的创建方式选择对应方案即可:
方案1:三个Launch Template单独定义
每个Launch Template渲染userdata时直接传入不同的ami_script值:
# 第一个Launch Template配置 resource "aws_launch_template" "lt1" { # 其他配置省略 user_data_base64 = base64encode(templatefile("../AMIs/s1_aws_userdata.sh", { ami = var.dci_appserver_ami ami_script = "your_first_script.sh" # 替换为第一个LT要执行的脚本名 })) } # 第二个Launch Template配置 resource "aws_launch_template" "lt2" { # 其他配置省略 user_data_base64 = base64encode(templatefile("../AMIs/s1_aws_userdata.sh", { ami = var.dci_appserver_ami ami_script = "your_second_script.sh" # 替换为第二个LT要执行的脚本名 })) } # 第三个Launch Template以此类推
方案2:批量创建Launch Template(推荐)
如果三个Launch Template配置相似度高,用count/for_each批量创建,统一维护脚本映射:
- 先定义Launch Template配置变量
variable "lt_configs" { type = list(object({ name = string ami_script = string })) default = [ {name = "lt-business-1", ami_script = "script_a.sh"}, {name = "lt-business-2", ami_script = "script_b.sh"}, {name = "lt-business-3", ami_script = "script_c.sh"} ] }
- 批量创建Launch Template
resource "aws_launch_template" "batch" { count = length(var.lt_configs) name = var.lt_configs[count.index].name # 其他通用配置省略 user_data_base64 = base64encode(templatefile("../AMIs/s1_aws_userdata.sh", { ami = var.dci_appserver_ami ami_script = var.lt_configs[count.index].ami_script })) }
兼容方案:仍使用template_file数据源
如果你需要保留现有template_file的写法,需要为每个Launch Template单独声明对应的数据源:
# 第一个LT的模板数据源 data "template_file" "lt1" { template = file("../AMIs/s1_aws_userdata.sh") vars = { ami = var.dci_appserver_ami ami_script = "script1.sh" } } # 第二个LT的模板数据源 data "template_file" "lt2" { template = file("../AMIs/s1_aws_userdata.sh") vars = { ami = var.dci_appserver_ami ami_script = "script2.sh" } } # 第三个LT的模板数据源以此类推
之后每个Launch Template分别引用对应数据源的渲染结果即可。
内容的提问来源于stack exchange,提问作者Maury Diaz
相关产品推荐
相关产品推荐

