如何在Terraform中为列表内map类型变量的RDS密码字段分别提示用户输入
可行实现方案
方案1:拆分变量结构,原生Terraform支持实现
你可以把密码字段从原来的rds_config_list中剥离,单独定义为敏感map变量,再通过local块合并为完整配置:
- 首先调整变量定义,移除
rds_config_list中的rds_password字段,新增独立密码变量:
variable "rds_config_list" { type = list(object({ rds_name = string rds_identifier = string rds_snapshot_identifier = string rds_postgres_instance_class = string rds_postgres_engine_version = string rds_postgres_family = string rds_postgres_allocated_storage = number rds_postgres_max_allocated_storage = number rds_backup_retention_period = number rds_postgres_multi_az = bool rds_postgres_deletion_protection = bool })) description = "RDS实例基础配置列表" } variable "rds_passwords" { type = map(string) description = "各RDS实例对应密码,key为rds_name,格式示例:{\"shiftleft\" = \"密码1\", \"shiftleft2\" = \"密码2\"}" sensitive = true }
- 新增local块合并基础配置和密码:
locals { full_rds_configs = [ for rds in var.rds_config_list : merge(rds, { rds_password = var.rds_passwords[rds.rds_name] }) ] }
后续你执行terraform apply时如果没有提前传入rds_passwords的值,Terraform会自动提示你输入该map参数,你按照格式填入对应实例的密码即可,也可以通过-var参数、或者单独的敏感tfvars文件传入密码。
方案2:外部脚本预处理,实现逐实例交互式输入
如果想要更友好的逐个提示输入,不需要手动拼写map格式,可以写简单的预处理脚本:
- 脚本先读取tfvars中
rds_config_list的所有rds_name - 循环提示用户输入每个实例的密码,自动生成
passwords.auto.tfvars文件存储密码map - 执行
terraform apply自动加载生成的密码配置
示例shell脚本逻辑参考:
#!/bin/bash # 需提前安装hcl2json、jq工具用于解析tfvars RDS_NAMES=$(hcl2json terraform.tfvars | jq -r '.rds_config_list[].rds_name') echo "rds_passwords = {" > passwords.auto.tfvars for name in $RDS_NAMES; do read -s -p "请输入RDS实例 ${name} 的密码: " pwd echo "" echo " \"${name}\" = \"${pwd}\"" >> passwords.auto.tfvars done echo "}" >> passwords.auto.tfvars
记得将passwords.auto.tfvars加入.gitignore,避免敏感信息提交到代码仓库。
注意事项
所有密码相关的变量必须加sensitive = true配置,避免Terraform在日志、输出中打印明文密码。
内容的提问来源于stack exchange,提问作者ConscriptMR
相关产品推荐
相关产品推荐

