Terraform 每个项目的不同后端
Terraform different backend for each project
我是 Terraform 的新手,仍在阅读文档,但尚未找到一种方法来适应我需要为特定解决方案实现的设置,希望一些好心人也许能给我一个正确方向的推动。
我正在尝试管理一组参数化模板,这些模板部署了支持我们在 GCP 中开发的新应用程序所需的一切。我想要实现的是能够将这些模板部署到三个不同的环境中,每个环境本身都在一个不同的 GCP 项目中。
计划是,根据建议,运行 terraform 并传入
a) 具体的 .tfvars 文件取决于 environment/project 部署到 (dev/test/prod)。
b) 使用 -chdir 参数告诉 Terraform 从 'infra-common' 文件夹中选取所有模板。
棘手的部分是我们希望每个环境(gcp 项目)在 gcs/storage 中托管它自己的状态文件。
我一直在查看工作区,但工作区似乎只会在单个后端上创建状态子文件夹。
问题:这个可以做吗?有更好的方法吗?
谢谢!
您可以为此使用 --backend-config
。以下是实现所需行为的方法:
- 为每个环境(
dev.config
、test.config
、prod.config
)创建一个 .config 文件,其中包含相应环境的 gcs 存储桶的名称(必须已经存在)
- 在单个
remote_state.tf
文件中指定通用后端
这是它的样子:
config/dev.config
:
bucket = "tf-state-dev"
config/test.config
:
bucket = "tf-state-test"
config/prod.config
:
bucket = "tf-state-prod"
remote_state.tf
:
terraform {
backend "gcs" {
prefix = "terraform/state"
}
}
然后,您可以运行初始化。因此,例如,对于开发人员来说,这看起来像:
$ terraform init --backend-config=config/dev.config
然后,您可以为环境创建一个工作区:
$ terraform workspace new dev
通过这种方法,您可以使用一组模板(实际上您可以根据当前工作区配置动态变量)。
您可以做的(我们有一个与不同云提供商具有类似设置的项目)是:
- 将
infra-common
用作模块
- 不是在每个环境中使用
.tfvar
个文件,而是在每个环境中使用一个单独的根模块,它调用 infra-common
作为 sub-module。
您的文件夹结构可能如下所示:
project
|-- dev
| `-- main.tf
|-- modules
| `-- infra-common
| |-- main.tf
| `-- variables.tf
|-- test
| `-- main.tf
`-- prod
`-- main.tf
dev/main.tf
terraform {
backend "gcs" {
bucket = "tf-state-dev"
prefix = "terraform/state"
}
}
module "stage" {
source = "../modules/infra-common"
env = "dev"
some_var = "value"
}
prod/main.tf
terraform {
backend "gcs" {
bucket = "tf-state-prod"
prefix = "terraform/state"
}
}
module "stage" {
source = "../modules/infra-common"
env = "prod"
some_var = "value"
}
我是 Terraform 的新手,仍在阅读文档,但尚未找到一种方法来适应我需要为特定解决方案实现的设置,希望一些好心人也许能给我一个正确方向的推动。
我正在尝试管理一组参数化模板,这些模板部署了支持我们在 GCP 中开发的新应用程序所需的一切。我想要实现的是能够将这些模板部署到三个不同的环境中,每个环境本身都在一个不同的 GCP 项目中。
计划是,根据建议,运行 terraform 并传入
a) 具体的 .tfvars 文件取决于 environment/project 部署到 (dev/test/prod)。
b) 使用 -chdir 参数告诉 Terraform 从 'infra-common' 文件夹中选取所有模板。
棘手的部分是我们希望每个环境(gcp 项目)在 gcs/storage 中托管它自己的状态文件。
我一直在查看工作区,但工作区似乎只会在单个后端上创建状态子文件夹。
问题:这个可以做吗?有更好的方法吗?
谢谢!
您可以为此使用 --backend-config
。以下是实现所需行为的方法:
- 为每个环境(
dev.config
、test.config
、prod.config
)创建一个 .config 文件,其中包含相应环境的 gcs 存储桶的名称(必须已经存在) - 在单个
remote_state.tf
文件中指定通用后端
这是它的样子:
config/dev.config
:
bucket = "tf-state-dev"
config/test.config
:
bucket = "tf-state-test"
config/prod.config
:
bucket = "tf-state-prod"
remote_state.tf
:
terraform {
backend "gcs" {
prefix = "terraform/state"
}
}
然后,您可以运行初始化。因此,例如,对于开发人员来说,这看起来像:
$ terraform init --backend-config=config/dev.config
然后,您可以为环境创建一个工作区:
$ terraform workspace new dev
通过这种方法,您可以使用一组模板(实际上您可以根据当前工作区配置动态变量)。
您可以做的(我们有一个与不同云提供商具有类似设置的项目)是:
- 将
infra-common
用作模块 - 不是在每个环境中使用
.tfvar
个文件,而是在每个环境中使用一个单独的根模块,它调用infra-common
作为 sub-module。
您的文件夹结构可能如下所示:
project
|-- dev
| `-- main.tf
|-- modules
| `-- infra-common
| |-- main.tf
| `-- variables.tf
|-- test
| `-- main.tf
`-- prod
`-- main.tf
dev/main.tf
terraform {
backend "gcs" {
bucket = "tf-state-dev"
prefix = "terraform/state"
}
}
module "stage" {
source = "../modules/infra-common"
env = "dev"
some_var = "value"
}
prod/main.tf
terraform {
backend "gcs" {
bucket = "tf-state-prod"
prefix = "terraform/state"
}
}
module "stage" {
source = "../modules/infra-common"
env = "prod"
some_var = "value"
}