gpt4 book ai didi

azure - 如何在 Terraform 中验证 IP 地址?

转载 作者:行者123 更新时间:2023-12-02 22:56:21 29 4
gpt4 key购买 nike

我正在使用 Terraform 将代码部署到我的 Azure 基础架构中。

我有一个带有一些网络规则的 Azure 防火墙,其中有一堆自由文本 IP 地址作为源/目标。下面是一个例子; [请注意,为了本示例,真实的 IP 地址已被更改];

网络规则收集

  network_rule_collection {
name = "test_rules"
priority = 400
action = "Allow"
rule {
name = "test-rule-1"
protocols = ["Any"]
source_addresses = ["123.0.2.10/32"]
destination_ports = ["1234"]
destination_addresses = ["124.82.189.200/32","125,82.189.200/32","126..82.189.200/32"]
}
}
}

[请注意,IP地址中有错误是为了演示]

但是,当我运行 Terraform Validate 时,它​​没有显示任何错误(即使上面输入了无效的 IP 地址)

因此,我需要一种方法来验证自由文本 IP 地址,作为 Terraform 验证/计划的一部分。目前,Terraform 接受这一点并将无效 IP 部署到基础设施中。

最佳答案

由于您填充的参数被定义为采用 CIDR block 地址,原则上提供程序可以验证这些,但在这种特殊情况下它似乎没有自己的验证规则因此它依赖于远程 API 的验证,因此仅在应用步骤期间生效。

可能值得在提供商的 GitHub 存储库中打开一个问题来讨论在此处添加内置验证的可能性,但为了这个答案,我将假设这是不可能的,并讨论如何在您的代码中定义验证规则。而是自己的配置。

<小时/>

由于这些值直接硬编码在资源配置中,因此无法进行自定义验证,因为 resource block 的内容是(除了一些特殊参数,例如 count code> 和 for_each)完全由相应提供者负责。

但是,如果您打算编写一个共享 Terraform 模块,将这些 IP 地址作为 input variables,然后从资源配置中引用它们,则可以编写 custom validation rules 来描述必须为 true 才能获得特定值的附加约束该变量被视为有效。

validation block 中的 condition 参数需要一个 bool 值,如果条件成立则为 true,如果条件成立则为 false > 如果不满足条件。然而,由于 Terraform 还具有许多内置函数,这些函数被定义为如果不满足其自己的验证规则,则会失败并出现错误,因此 Terraform 还有一个特殊的 can function,它在特殊上下文中评估表达式,其中失败被转换为false 结果,任何成功都会转换为 true 结果,从而满足 condition 参数的期望。

典型的策略是识别现有的 Terraform 函数,该函数具有与您要应用的相同的验证规则,并在 can 中调用该值以使用其成功或失败作为验证条件。

特别是对于 CIDR block 地址,Terraform 有少量函数将这些地址作为输入并生成派生的 CIDR block 地址或 IP 地址。例如,cidrnetmask 采用 IPv4 CIDR block 地址并以网络掩码表示法返回相同的地址。如果给定的字符串不是有效的 IPv4 CIDR block ,它将失败,因此它似乎是描述您要在此处检查的规则的良好候选者:

variable "source_address" {
type = string

validation {
condition = can(cidrnetmask(var.source_address))
error_message = "Must be a valid IPv4 CIDR block address."
}
}

这里的示例有接受多个地址的额外要求,因此需要稍微复杂的验证规则来测试条件是否适用于给定集合的所有成员,这就是 the alltrue function适用于:

variable "source_addresses" {
type = set(string)

validation {
condition = alltrue([
for a in var.source_addresses : can(cidrnetmask(a))
])
error_message = "All elements must be valid IPv4 CIDR block addresses."
}
}

这里的 [ for ... ] 表达式通过对每个元素 a< 尝试 can(cidrnetmask(a)) 来生成 bool 结果列表该组的。然后,alltrue 解释该结果,并仅当列表中的每个元素都为 true 时才返回单个 true

为了应用这些规则,您需要通过这些输入变量传递可能无效的 IP 地址,而不是像示例中那样直接在 resource block 内提供它们。只有当您打算编写一个可重用模块(其中调用者将为每个实例提供不同的 IP 地址)时,这才真正有意义。如果您打算只拥有一组固定的 IP 地址,那么在最初指定它们时确保它们有效并相信它们在未来将保持有效(除非发生更改)会更简单。

关于azure - 如何在 Terraform 中验证 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71143820/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com