基于 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
我正在使用 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