「这里不能使用变量吗…」,Terraform 这样说道
Terraform是一個很棒的工具,不需要一個一個地在瀏覽器控制台上進行繁瑣的創建,只需一個命令就可以完成整個基礎設施的構建。
打算下載源代碼,編輯terraform.tfvars的變量,然後設計成運行terraform init,terraform apply即可完成構建。但因為部分地方無法使用變量而遇到困難,所以作為備忘錄記錄下來。
太长不看
-
- プロバイダーバージョンの指定にはvariableは使えない。
-
- バックエンドの定義にはvariableは使えない。
terraform init で必要な定義はvariableで指定できない。
版本指定的提供者
根据在Issue上的评论所述
provider "aws" {
version = "${var.aws_provider_version}"
region = "${var.aws_region}"
}
据说根据提供者的版本变量进行定义是不可行的。
provider "aws" {
version = "~> 2.0"
region = "${var.aws_region}"
}
听说必须这样做才能符合规范。我就老老实实地硬编码处理了这部分……。
后端的定义
当执行terraform.apply时,将会创建一个以JSON格式记录构建基础设施状态的terraform.tfstate文件。但是,如果定义了后端,则可以将tfstate文件保存和管理在S3存储桶等地方。
terraform {
backend "s3" {
bucket = "${var.bucket_name}"
key = "${var.key}"
region = "${var.region}"
}
}
我本想去那个地方,但看来也是不行的。
解决方案1:顺从地硬编码
一个简单的解决方案。
terraform {
backend "s3" {
bucket = "mybucket"
key = "path/to/terraform.tfstate"
region = "us-east-1"
}
}
这个人在代替我抱怨,说为什么还要硬编码呢。
解决方案2:在执行 terraform init 时,通过 -backend-config 指定配置。
命令行键/值对: 可以通过init命令行指定键/值对。请注意,许多shell会将命令行标志保存在历史文件中,因此这不推荐用于保密信息。在运行terraform init时,可以使用-backend-config=”KEY=VALUE”选项来指定单个键/值对。
在执行 terrarfom init 时,可以使用 -backend-config 参数来指定与文档中写的一样的配置。
terraform {
backend "s3" {
}
}
暫且這樣做/先這麼安排
$ terraform init -backend-config="bucket=backend.bucket" \
-backend-config="key=path/to/terraform.tfstate" \
-backend-config="region=us-east-1"
执行 terraform init,就像这样。
解决方案3:将设置写入其他文件中。
可能的翻译:根据issue中的评论所说,有一种方法是将变量写入另一个文件中,并在进行terraform init时进行加载。
terraform {
backend "s3" {
}
}
bucket = "mybucket"
key = "path/to/terraform.tfstate"
region = "us-east-1"
作为备用
$ terraform init -reconfigure -backend-config=production.tfbackend
以类似的方式执行。
概括一下
在执行 terraform plan 或 terraform apply 等操作时,变量的值会被反映出来。在 terraform init 中,无法通过变量来定义必需的配置,只能硬编码或采取相应的解决方案。