如何在Terraform中根据环境配置不同SSH密钥的metadata?
解决方案
你当前的写法存在两个核心问题:
- 重复定义了
metadata变量,Terraform不允许重复声明同一个属性/变量,会直接报错; count是资源级别的参数,不能放在metadata这个映射对象内部使用。
下面提供两种简洁易维护的实现方式:
方式一:直接用条件表达式(适合少量环境场景)
在ssh-keys字段通过环境变量直接判断赋值,其他固定字段直接复用:
metadata = { ssh-keys = var.ENV_TYPE == "ENV-1" ? "centos:ssh-rsa AAAAsfdsds..." : "centos:ssh-rsa BBBBsfdsds..." instance_role = var.GCP_CUSTOM_METADATA app_env_monitoring = var.GCP_CUSTOM_METADATA_MONITORING }
方式二:用map映射(适合未来可能扩展多环境的场景)
先定义环境与SSH密钥的对应关系,再通过环境变量取值,后续新增环境只需修改映射表:
# 定义环境到密钥的映射关系 locals { env_ssh_keys = { "ENV-1" = "centos:ssh-rsa AAAAsfdsds..." "ENV-2" = "centos:ssh-rsa BBBBsfdsds..." } } # 在metadata中引用映射值 metadata = { ssh-keys = local.env_ssh_keys[var.ENV_TYPE] instance_role = var.GCP_CUSTOM_METADATA app_env_monitoring = var.GCP_CUSTOM_METADATA_MONITORING }
可选优化:添加默认值容错
如果担心输入的环境不在映射范围内导致报错,可以用lookup函数添加默认密钥:
ssh-keys = lookup(local.env_ssh_keys, var.ENV_TYPE, "centos:ssh-rsa 默认备用密钥内容...")
内容的提问来源于stack exchange,提问作者sdvjke
相关产品推荐
相关产品推荐

