Terraform CIDR块变量验证



CIDR的Terraform变量验证,寻找正则表达式的替代方案

以下是Terraform 13.0版本中的测试代码有没有其他方法可以不使用regex来实现同样的目的?

cidr块-启动172.28.0.0.0/16

variable "vpc_cidr" {
description = "Kubernetes cluster CIDR notation for vpc."
validation {
condition     = can(regex("^([0-9]{1,3}\.){3}[0-9]{1,3}($|/(16))$", var.pod_cidr))
error_message = "Vpc_cidr value must be greater than 172.0.0.0/16."
}
}

如何使用cidrsubnet函数验证CIDR块172.28.x.x/16?https://www.terraform.io/docs/language/functions/cidrsubnet.html

验证条件-如果IP范围超出172.28.x.x/16,则验证将失败

我更喜欢https://dev.to/drewmullen/terraform-variable-validation-with-samples-1ank

variable "string_like_valid_ipv4_cidr" {
type    = string
default = "10.0.0.0/16"
validation {
condition     = can(cidrhost(var.string_like_valid_ipv4_cidr, 32))
error_message = "Must be valid IPv4 CIDR."
}
}

另请注意,正如那里所评论的,该条件需要修改才能适用于/32个地址。

我想不出一种直接的方法来实现您在当今Terraform中想要的功能,但我认为我们可以将检查分解为两个条件,这两个条件加在一起会产生相同的效果:

  1. 子网中的第零个地址必须是172.28.0.0
  2. 该范围的网络掩码必须是255.255.0.0

我们可以使用两个表达式来测试这两个规则:

  1. cidrhost(var.vpc_cidr, 0) == "172.28.0.0"
  2. cidrnetmask(var.vpc_cidr) == "255.255.0.0"

如果给定的CIDR块语法根本无效,这两个函数都可能失败,如果给定IPv6地址,cidrnetmask也会失败,因此我们可以向它们添加try保护,将错误转化为错误结果,正如condition所期望的那样:

  1. try(cidrhost(var.vpc_cidr, 0), null) == "172.28.0.0"
  2. try(cidrnetmask(var.vpc_cidr), null) == "255.255.0.0"

try函数将返回不产生动态错误的第一个表达式的结果,因此在上述示例中,对cidrhostcidrnetmask函数的无效输入将导致类似null == "172.28.0.0"的表达式,该表达式将始终为false,因此条件仍然不满足。

最后,我们可以使用&&算子将它们组合在一起,得到完整的condition表达式:

condition = (
try(cidrhost(var.vpc_cidr, 0), null) == "172.28.0.0" &&
try(cidrnetmask(var.vpc_cidr), null) == "255.255.0.0"
)

您有一个对多个0,它应该大于172.0.0.0/16。例如:

172.1.0.0/16

不是:

172.0.0.0.0/16

有点破解,但仍然:

variable "vpc_cidr" {
validation {
condition = cidrsubnet("${var.pod_cidr}/16", 0, 0) == "172.28.0.0/16"
}
}