for_each
for_each 在功能上与 count 相似,for_each 使用键值对或字符串集合的形式快速地将值填入到对应的属性中,不仅可以优化脚本结构也有利于理解多实例间的关系。
在使用映射类型表达时,我们可以使用 "each.key" 和 "each.value" 来访问映射的键和值。以创建VPC为例,通过 for_each 中的键值对,我们可以灵活配置VPC的名称和CIDR。
resource "huaweicloud_vpc" "vpcs" { for_each = { vpc_demo1 = "192.168.0.0/16" vpc_demo2 = "172.16.0.0/16" } name = each.key cidr = each.value }
在使用字符串集合类型表达时,"each.key" 等同于 "each.value",我们一般使用 each.key表示,另外,可以通过 toset() 函数将定义的 list 类型进行转化:
resource "huaweicloud_networking_secgroup" "mysecgroup" {
for_each = toset(["secgroup_demo1", "secgroup_demo2"])
name = each.key
}
# 通过变量表示 for _each
variable "secgroup_name" {
type = set(string)
}
resource "huaweicloud_networking_secgroup" "mysecgroup" {
for_each = var.secgroup_name
name = each.key
}
使用 for_each 创建的资源需要通过键名进行访问,格式为:<资源类型>.<名称>[键名]
# 访问 vpc_demo1 > huaweicloud_vpc.vpcs["vpc_demo1"] # 访问 vpc_demo1 的ID > huaweicloud_vpc.vpcs["vpc_demo1"].id
由于 count 和 for_each 都可用于创建多个资源,建议参考以下规则进行选择:
1、如果资源实例的参数完全或者大部分一致,建议使用count;
2、如果资源的某些参数需要使用不同的值并且这些值不能由整数派生,建议使用 for_each;