- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
有什么方法可以将 Terraform 模板输出用于另一个 Terraform 模板的输入? 例如:我有一个创建 ELB 的 Terraform 模板,我有另一个 Terraform 模板,它将创建一个
我正在使用 Terraform 在 Azure 中设置虚拟网络。 我有几个 VNet,每个 VNet 都有自己的网络安全组 100% 在 Terraform 中管理,在运行 Terraform 之前不
resources and data sources在 terraform 文档中 link ,谁能解释一下它们的区别以及可以使用它们的示例场景 最佳答案 Data Sources :允许 Terra
terraform plan 等命令如何知道/决定使用哪些文件? -help 显示了一个 DIR-OR-PLAN 参数,但没有显示如何使用它: $ terraform -help plan Usage
我在尝试运行使用 terraform lock 的 terraform 脚本时收到以下错误消息。 *Acquiring state lock. This may take a few moments.
我想简化这样的构造 variable "google" { type = object({ project = string region = string
这是一个场景 - 您开发用于研发组织的 terraform 模块。它们已经被一两个微服务使用,转化为十几个 pod。您确定了重构机会,例如将某些功能提取到其自己的 terraform 模块中。很好,但
Terraform 是否支持条件属性?我只想根据变量的值使用属性。 例子: resource "aws_ebs_volume" "my_volume" { availability_zone =
我想将此作为功能请求发布,但我想在发布之前看看是否有其他人找到了一些聪明的方法。或者也许 Hashicorp 的某个人可以告诉我这将是 future 的一个功能 在运行 terraform apply
我在 terraform 的变量插值中遇到了麻烦。这是我的 terraform 配置的样子。即内置函数内的变量 variable "key" {} ssh_keys { pat
运行 terraform 并等待需要很长时间。 所以我想运行它来排除需要最长执行时间的 rds 或者我只想运行 ec2 资源。 有没有办法在 terraform 中做这样的事情? 最佳答案 您可以使用
terraform 是否提供这样的功能来覆盖变量值?假设我已经声明了下面给出的两个变量。 variable "foo" {} variable "bar" { default = "false"} f
我正在为 Terraform Associate Certification 做准备考试。我在 Udemy 上进行了一次练习考试,并收到了一个关于自动安装社区提供程序的问题。但是,根据实际 terra
我有很多使用 Terraform 的 gcp-provider 用 Terraform 0.11 编写的 Terraform 模块,并希望将其升级到 Terraform 0.12。 为此,我需要保留系
我的项目有 2 个存储库。静态网站和服务器。我希望网站由 cloudfront 和 s3 托管,服务器在 elasticbeanstalk 上。我知道这些资源至少需要了解 Route53 资源才能在同
我能有这样的资源吗 resource "foo" "bar.baz"{ ... } 或者以后 . 会把我搞砸吗?特别是,是否允许这样做: resource "foo" "other"{ ...
我能有这样的资源吗 resource "foo" "bar.baz"{ ... } 或者以后 . 会把我搞砸吗?特别是,是否允许这样做: resource "foo" "other"{ ...
运行时terraform init使用 Terraform 时 0.11.3我们收到以下错误: Initializing provider plugins... - Checking for avai
我正在尝试将项目的 CLI 工作区迁移到 Terraform Cloud。我正在使用 Terraform 版本 0.14.8 并遵循官方指南 here . $ terraform0.14.8 work
尝试在Azure Pipeline中将terraform init作为任务运行时,错误指出 spawn C:\hostedtoolcache\windows\terraform\0.12.7\x64\
我是一名优秀的程序员,十分优秀!