如果您愿意,如何将 Terraform 脚本用作"common"脚本、库或子例程?



我看到了如何在没有模块依赖的情况下共享地形脚本,但我有一个不同的场景(尽管那篇文章也很棒(。

在我的情况下,我有一个脚本来创建一个现场车队请求。我想使用这个通用脚本来创建多个现场车队请求。

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命令即可。有关设置后端配置文件的信息,请参阅以下文档。

相关内容

  • 没有找到相关文章

最新更新