Terraform能否使用不同权限部署资源?具体实现方式是什么?
问题答复
Terraform完全支持该需求,有两种成熟的实现方案,可根据实际使用场景选择:
方案1:按子目录拆分独立工作目录(推荐)
该方案完全匹配你现有按子目录存放资源的结构,实现成本最低,隔离性最好:
- 每个资源子目录单独作为Terraform工作目录,各自维护独立的
provider配置、变量定义和状态文件 - 不同目录的provider块单独配置对应权限的凭证:ABC类资源目录配置管理员权限凭证,XYZ类资源目录配置低权限凭证
- 部署时分别进入对应目录执行
terraform init、terraform plan、terraform apply即可,两类资源的部署流程完全独立,互不影响
示例仓库结构参考:
仓库根目录 ├── abc-resources/ # 存放需管理员权限的ABC类资源 │ ├── main.tf # 内部provider配置管理员权限 │ └── variables.tf └── xyz-resources/ # 存放低权限要求的XYZ类资源 ├── main.tf # 内部provider配置低权限 └── variables.tf
如果不想把凭证硬编码到配置文件,可通过环境变量动态传递:部署ABC类资源前先设置对应Provider的管理员凭证环境变量,部署XYZ类资源前替换为低权限凭证即可,无需修改代码。
方案2:同一工作目录下配置多Provider别名
如果你不想拆分多个工作目录,可通过Terraform的Provider别名功能实现同一Provider的多权限配置:
- 在根目录的配置文件中声明同一Provider的两个不同实例,用别名区分权限等级,示例代码如下:
# 管理员权限的Provider实例,别名admin provider "你的云厂商名称" { alias = "admin" secret_id = var.admin_secret_id secret_key = var.admin_secret_key # 其余公共配置和默认Provider保持一致 } # 低权限的Provider实例,别名normal provider "你的云厂商名称" { alias = "normal" secret_id = var.normal_secret_id secret_key = var.normal_secret_key # 其余公共配置和默认Provider保持一致 }
- 定义资源时通过
provider参数绑定对应权限的Provider实例即可:
# ABC类资源绑定管理员权限Provider resource "云厂商资源类型" "abc_demo" { provider = 你的云厂商名称.admin # 其余资源配置 } # XYZ类资源绑定低权限Provider resource "云厂商资源类型" "xyz_demo" { provider = 你的云厂商名称.normal # 其余资源配置 }
- 部署时既可以执行全量部署,Terraform会自动调用对应权限操作对应资源;也可以通过
terraform apply -target=资源类型.资源名的命令单独部署某类资源。
内容的提问来源于stack exchange,提问作者Bala Murali
相关产品推荐
相关产品推荐

