Terraform动态块报错:不支持vnis块类型问题咨询
解决iosxe_interface_nve资源动态生成VNIs的报错问题
错误原因
你遇到的Blocks of type "vnis" are not expected here报错,核心是混淆了Terraform嵌套块与列表属性的用法:netascode/iosxe provider的iosxe_interface_nve资源中,vnis是一个列表类型的属性,而非可通过dynamic块生成的嵌套块结构,所以直接用dynamic "vnis"会被Terraform判定为非法语法。
正确写法
如果需要动态生成VNIs列表,直接通过列表推导式构造vnis属性的值即可,不需要使用动态块。
示例代码
假设你定义了包含VNI配置的变量:
variable "vnid_list" { type = list(object({ vni = number associate_vrf = string ingress_replication = optional(string) # 可选属性示例 })) default = [ {vni = 1000, associate_vrf = "VRF_PROD"}, {vni = 2000, associate_vrf = "VRF_DEV"} ] }
对应的iosxe_interface_nve资源配置:
resource "iosxe_interface_nve" "nve1" { name = "NVE1" shutdown = false source_interface = "Loopback0" host_reachability_protocol = "bgp" # 用列表推导式动态生成vnis属性值 vnis = [for vni_cfg in var.vnid_list : { vni = vni_cfg.vni associate_vrf = vni_cfg.associate_vrf # 若有可选属性,按需添加 ingress_replication = vni_cfg.ingress_replication != null ? vni_cfg.ingress_replication : null }] }
关键说明
- 动态块(
dynamic "xxx")仅适用于Terraform资源定义中明确标记为嵌套块的结构(例如部分路由资源中的route块、ACL资源中的rule块) - 查看
iosxe_interface_nve的资源schema可以确认:vnis的类型是list(object({...})),属于普通属性,因此直接赋值列表即可实现动态生成
内容的提问来源于stack exchange,提问作者Christophe
相关产品推荐
相关产品推荐

