Terraform – Dynamic Block使用
Terraform 的 dynamic block 是一种特殊的语法结构,用来动态生成嵌套块。它的主要作用是根据变量、列表或映射动态创建重复的块,从而避免复制粘贴大量几乎相同的代码,提高配置的灵活性和可维护性。
例如,在一个资源中,某些嵌套块(如安全组规则、拓扑配置等)可能只在特定条件下需要生成,通过 dynamic block 我们可以根据条件判断是否生成对应块。
基本语法
dynamic block 的基本语法格式如下:
dynamic "block_label" {
for_each = <表达式> # 要遍历的集合(列表、映射或集合)
iterator = <迭代器名称> # 可选,默认使用 block_label
content {
# 此处填写每个生成块的内容,可使用 iterator.value 引用当前元素
}
}
- block_label:指定生成的嵌套块的类型,例如 “ingress”、“topology” 等。
- for_each:指定要遍历的集合。如果集合为空,则不会生成该嵌套块。
- iterator:为当前迭代元素设置的变量名,默认为 block_label。常用属性有 key 和 value。
- content:定义每个动态生成块的内容。
动态生成aws security group
当需要批量创建安全组规则时,也可以用 dynamic block 遍历一个规则列表,根据规则的类型动态生成 ingress 或 egress 块。
provider "aws" {
region = "ap-southeast-1"
}
variable "sg_ports" {
type = list(object({
from_port = number
to_port = number
protocol = string
cidr_blocks = list(string)
}))
default = [
{
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
},
{
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
]
}
resource "aws_security_group" "sg1" {
name = "dynamic_sg"
dynamic "ingress" {
for_each = var.sg_ports
iterator = data
content {
from_port = data.value.from_port
to_port = data.value.to_port
protocol = data.value.protocol
cidr_blocks = data.value.cidr_blocks
}
}
}
Facebook评论