「这里不能使用变量吗…」,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 中,无法通过变量来定义必需的配置,只能硬编码或采取相应的解决方案。

广告
将在 10 秒后关闭
bannerAds