基于terraform中count.index的属性差异

时间:2018-05-05 06:20:00

标签: terraform

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

  

模块目前不支持count参数。

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

$ 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文件中声明了必要的变量。我该如何解决这个问题?在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

count资源中module的方式将推断您希望创建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"}"
  }
}

答案 1 :(得分:0)

模块没有计数。它仅在资源上提供。

答案 2 :(得分:0)

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

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