我看到了如何在没有模块依赖的情况下共享地形脚本,但我有一个不同的场景(尽管那篇文章也很棒(。
在我的情况下,我有一个脚本来创建一个现场车队请求。我想使用这个通用脚本来创建多个现场车队请求。
provider "aws" {
region = var.region
}
terraform {
required_version = ">= 0.12.17, < 0.13.10"
}
resource "aws_spot_fleet_request" "jenkins_build_fleet" {
...
launch_specification {
...
}
}
我想要一个有的脚本
terraform {
backend "s3" {
bucket = "my-terraform-remote-states"
key = "jenkins-qa/terraform.tfstate"
region = "us-east-1"
}
}
另一个有
terraform {
backend "s3" {
bucket = "my-terraform-remote-states"
key = "jenkins-slaves/terraform.tfstate"
region = "us-east-1"
}
}
IOW,每个脚本的远程状态密钥不同,因此当我应用/销毁他们各自的计划时,他们将创建自己的现场车队请求,而不会影响任何其他现场车队请求。我希望能够在不必指定-target
参数的情况下运行每个具体脚本,这意味着我不希望所有3个脚本都在同一目录中。理想情况下,我希望文件结构是
/path/common_script.tf
/path/script1/script1.tf
/path/script2/script2.tf
有办法做到这一点吗?
我建议使用Terraform Workspaces来完成这类工作。S3后端提供商支持Workspaces,并将创建一个单独的";文件夹";在S3中存储每个工作空间的状态文件。
我已经成功地使用它来部署具有相同Terraform文件的dev/test/prod环境。您只需要先运行terraform workspace select
,然后再运行terraform apply
;普通的";Terraform中的库更符合Terraform模块所解决的问题。而您的问题更多的是关于如何让Terraform管理的资源的多个实例具有多个状态文件,这就是Workspaces解决的问题。
编辑其他详细信息:
你可以有一个像这样的Terraform模板文件:
provider "aws" {
region = var.region
}
terraform {
required_version = ">= 0.12.17, < 0.13.10"
}
resource "aws_spot_fleet_request" "jenkins_build_fleet" {
...
launch_specification {
...
}
}
terraform {
backend "s3" {
bucket = "my-terraform-remote-states"
key = "jenkins/terraform.tfstate"
region = "us-east-1"
}
}
然后像这样应用一次:
terraform workspace select jenkins_qa
terraform apply
然后像这样再次应用:
terraform workspace select jenkins_slaves
terraform apply
这将导致向AWS部署两组独立的资源,在S3存储桶中有两个独立的状态文件,并以工作区名称为前缀,而不必使用任何重复的代码。
或者,如果您想保持当前的文件和文件夹分隔:
你可以在/common
文件夹中有一个Terraform模块,如下所示:
provider "aws" {
region = var.region
}
terraform {
required_version = ">= 0.12.17, < 0.13.10"
}
resource "aws_spot_fleet_request" "jenkins_build_fleet" {
...
launch_specification {
...
}
}
然后你可以在/script1
文件夹中有一个Terraform模板,如下所示:
terraform {
backend "s3" {
bucket = "my-terraform-remote-states"
key = "jenkins-qa/terraform.tfstate"
region = "us-east-1"
}
}
module "common" {
source = "../common"
}
在不同的工作空间中多次应用此/script1
模板,或者将其复制到指向不同状态文件的单独模板中。如果重复代码的唯一区别是状态文件的名称,那么您可以通过使用工作区来消除这种重复。
您提到您认为输出是模块的需求,但事实并非如此。但是,您可以从模块中输出类似spot_bid_status
的值,然后从主模板中再次输出,例如在apply
之后将其打印到屏幕上。
IOW,每个脚本的远程状态密钥不同
那么这两个文件中到底有什么呢?
/path/script1/script1.tf
/path/script2/script2.tf
如果它们所包含的只是如您所示的后端配置,那么它们就是多余的。在Terraform中,目录是一个可以重用的"模块",所以如果你想的话,你可以把你的"通用脚本"放在一个模块中,但我不建议在这种简单的情况下使用它。
无论如何,为了回答您的问题,您可以使用部分后端配置来支持多个后端。只需将-backend-config <backend-config-file>
传递给terraform init
命令即可。有关设置后端配置文件的信息,请参阅以下文档。