基于 terraform count.index 的属性差异

Variance in attributes based on count.index in terraform

我正在使用 Hashicorp terraform 在 AWS 上创建一个 MySQL 集群。我创建了一个名为 mysql 的模块,并希望将创建的第一个实例标记为 master。但是,根据 terraform 文档:

Modules don't currently support the count parameter.

我该如何解决这个问题?目前,我的文件中有这些:

$ cat project/main.tf
module "mysql_cluster" {
  source = "./modules/mysql"
  cluster_role = "${count.index == "0" ? "master" : "slave"}"
}

$ cat project/modules/mysql/main.tf
..
resource "aws_instance" "mysql" {
  ami           = "ami-123456"
  instance_type = "t2.xlarge"
  key_name      = "rsa_2048"

  tags {
    Role = "${var.cluster_role}"
  }

  count = 3
}

这会引发错误:

$  project git:(master) ✗ terraform plan

Error: module "mysql_cluster": count variables are only valid within resources

我在 mysql 模块和根模块的 variables.tf 文件中声明了必要的变量。我该如何解决这个问题?在此先感谢您的帮助!

您在 module 资源中拥有 count 的方式会推断您想要创建 3 个模块,而不是创建模块中的 3 个资源。您可以规定来自 module 资源的计数,但任何使用 count.index 的逻辑都需要位于模块中。

main.tf

module "mysql_cluster" {
  source          = "./modules/mysql"
  instance_count  = 3
}

mysql.tf

resource "aws_instance" "mysql" {
  count         = "${var.instance_count}"
  ami           = "ami-123456"
  instance_type = "t2.xlarge"
  key_name      = "rsa_2048"

  tags {
    Role        = "${count.index == "0" ? "master" : "slave"}"
  }
}

模块没有计数。它仅在资源中可用。

从 Terraform 0.13 开始,您可以使用 for_each 或计数来创建模块的多个实例。

variable "regions" {
  type = map(object({
    region            = string
    network           = string
    subnetwork        = string
    ip_range_pods     = string
    ip_range_services = string
  }))
}

module "kubernetes_cluster" {
  source   = "terraform-google-modules/kubernetes-engine/google"
  for_each = var.regions

  project_id        = var.project_id
  name              = each.key
  region            = each.value.region
  network           = each.value.network
  subnetwork        = each.value.subnetwork
  ip_range_pods     = each.value.ip_range_pods
  ip_range_services = each.value.ip_range_services
}

代码截自 https://github.com/hashicorp/terraform/tree/guide-v0.13-beta/module-repetition

官方文档 https://www.terraform.io/docs/configuration/modules.html