Terraform新手在这里。我想使用 迭代列表for_each,但键和值似乎相同:
provider "aws" {
profile = "default"
region = "us-east-1"
}
variable "vpc_cidrs" {
default = ["10.0.0.0/16", "10.1.0.0/16"]
}
resource "aws_vpc" "vpc" {
for_each = toset(var.vpc_cidrs)
cidr_block = each.value
enable_dns_hostnames = true
tags = { Name = "Company0${each.key}" }
}
Run Code Online (Sandbox Code Playgroud)
我想的标签名称是"Name" = "Company01"和"Name" = "Company02",但根据terraform apply我得到:
"Name" = "Company010.0.0.0/16"和"Name" = "Company010.1.0.0/16"
我缺少什么?
Mos*_*she 20
使用index函数找到了一个简单的解决方案:
tags = { Name = "Company0${index(var.vpc_cidrs, each.value) + 1}" }
Run Code Online (Sandbox Code Playgroud)
mar*_*iux 14
还有另一种方法可以在不使用的情况下实现想要的结果index():
更改以下三行:
for_each = { for idx, cidr_block in var.vpc_cidrs: cidr_block => idx}
cidr_block = each.key
tags = { Name = format("Company%02d", each.value + 1) }
Run Code Online (Sandbox Code Playgroud)
for_each将使用地图上cidr_block以index映射由作为返回 for cidr_block则可以只使用each.key值tags也使用format()oneach.value有一个带前导零的两位数index完整示例将是:
provider "aws" {
profile = "default"
region = "us-east-1"
}
variable "vpc_cidrs" {
default = ["10.0.0.0/16", "10.1.0.0/16"]
}
resource "aws_vpc" "vpc" {
for_each = { for idx, cidr_block in var.vpc_cidrs: cidr_block => idx}
cidr_block = each.key
enable_dns_hostnames = true
tags = { Name = format("Company%02d", each.value + 1) }
}
Run Code Online (Sandbox Code Playgroud)
当for_each与 set 一起使用时,each.key以及each.value是相同的。
要生成“Company01”、“Company02”等字符串,您需要列表中每个 CIDR 块的索引。一种方法是使用如下for表达式创建本地地图:
locals {
vpc_cidrs = {for s in var.vpc_cidrs: index(var.vpc_cidrs, s) => s}
}
resource "aws_vpc" "vpc" {
for_each = local.vpc_cidrs
cidr_block = each.value
enable_dns_hostnames = true
tags = { Name = "Company0${each.key}" }
}
Run Code Online (Sandbox Code Playgroud)
作为奖励,您可以使用format函数来构建零填充的名称字符串:
resource "aws_vpc" "vpc" {
...
tags = { Name = format("Company%02d", each.key) }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17655 次 |
| 最近记录: |