部署EKS时,如何在Terraform的user_data.tpl中引用TF变量?
解决Terraform EKS托管节点组user_data模板变量不生效的问题
问题根源
你在user_data.tpl里用了Shell的变量语法${USERNAME},但Terraform不会自动把定义的TF变量注入到模板中,必须通过Terraform的模板渲染机制,明确传递变量并使用对应语法。
解决步骤
1. 调整user_data.tpl的变量引用
把模板里的变量替换成Terraform模板支持的插值格式,比如:
sudo wget --http-user=${artifactory_username} --http-password=${artifactory_password} https://artifactorycloud.mypage.com/artifactory/l-generic-agent-binaries/splunk-agent/aws/latest/AWS_NIX_latest_UF.zip
这里的artifactory_username和artifactory_password是模板内部的变量名,后续会和TF变量关联。
2. 在节点组配置中传递模板变量
在你的eks_managed_node_groups配置块里,新增user_data_template_vars参数,把TF定义的USERNAME和PASSWORD变量传递给模板:
eks_managed_node_groups = { "${var.cluster_name}_managed_node_group" = { ami_release_version = var.ami_version create_launch_template = true launch_template_name = var.launch_template_name user_data_template_path = "./user_data.tpl" # 新增这部分,传递模板需要的变量 user_data_template_vars = { artifactory_username = var.USERNAME artifactory_password = var.PASSWORD } # 其他原有配置... } }
3. 验证渲染结果
可以临时添加一个输出项,检查模板是否正确渲染:
output "rendered_user_data" { value = templatefile("./user_data.tpl", { artifactory_username = var.USERNAME artifactory_password = var.PASSWORD }) }
执行terraform apply后查看输出,确认变量已经被正确替换成实际值。
额外提示
如果密码包含特殊字符(比如$、!),建议用单引号包裹参数,避免Shell解析异常:
sudo wget --http-user='${artifactory_username}' --http-password='${artifactory_password}' https://artifactorycloud.mypage.com/artifactory/l-generic-agent-binaries/splunk-agent/aws/latest/AWS_NIX_latest_UF.zip
内容的提问来源于stack exchange,提问作者Bianca Torres
相关产品推荐
相关产品推荐

