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中想要的功能,但我认为我们可以将检查分解为两个条件,这两个条件加在一起会产生相同的效果:
- 子网中的第零个地址必须是
172.28.0.0
- 该范围的网络掩码必须是
255.255.0.0
我们可以使用两个表达式来测试这两个规则:
cidrhost(var.vpc_cidr, 0) == "172.28.0.0"
cidrnetmask(var.vpc_cidr) == "255.255.0.0"
如果给定的CIDR块语法根本无效,这两个函数都可能失败,如果给定IPv6地址,cidrnetmask
也会失败,因此我们可以向它们添加try
保护,将错误转化为错误结果,正如condition
所期望的那样:
try(cidrhost(var.vpc_cidr, 0), null) == "172.28.0.0"
try(cidrnetmask(var.vpc_cidr), null) == "255.255.0.0"
try
函数将返回不产生动态错误的第一个表达式的结果,因此在上述示例中,对cidrhost
或cidrnetmask
函数的无效输入将导致类似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"
}
}