我正在尝试开发通用的terraform模块以支持数据狗监视器,并允许模块的用户在侧面通用模块中附加资源和/或覆盖资源。
terraform overrides功能在没有模块的情况下可以正常工作,但在使用模块时则无法工作。
如何覆盖模块内部的某些资源参数?
要求:
/modules/datadog/monitors.tf 包含资源列表,每个资源代表具有默认参数值的通用datadog监视器。每个单个应用都可以选择覆盖每个资源中的一个或多个参数。。
/application-1/monitors.tf 包含源为 / modules / datadog / 的模块,还有一些通用监视器未涵盖的监视器和一些变量。
/application-1/monitors.tf
module "datadog" {
source = "/modules/datadog/"
}
/modules/datadog/monitors.tf
# Generic Datadog monitor to monitor cpu
resource "datadog_monitor" "foo" {
name = "Name for monitor foo"
type = "metric alert"
message = "Monitor triggered. Notify: @hipchat-channel"
escalation_message = "Escalation message @pagerduty"
query = "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 4"
thresholds {
ok = 0
warning = 2
warning_recovery = 1
critical = 4
critical_recovery = 3
}
notify_no_data = false
renotify_interval = 60
notify_audit = false
timeout_h = 60
include_tags = true
silenced {
"*" = 0
}
tags = ["foo:bar", "baz"]
}
解决方案1 :将overrides.tf添加到 / modules / datadog 目录中。 terraform override feature将overrides.tf中的内容合并到
在monitors.tf中定义的配置。
但是此解决方案的问题是每个应用程序特定的overrides.tf需要在运行apply命令之前复制到/ modules / datadog目录。
overrides.tf
resource "datadog_monitor" "foo" {
escalation_message = "Escalation message @pagerduty1"
thresholds {
ok = 0
warning = 20
warning_recovery = 10
critical = 40
critical_recovery = 35
}
notify_no_data = false
}
解决方案2 :我可以对模块使用替代吗?我试图通过将overrides.tf复制到/ application-1 /目录来覆盖资源参数,但是terraform不会覆盖资源,而是将两者都视为不同的资源。
答案 0 :(得分:3)
如果要创建资源,则可以使用带条件的条件计数来覆盖。下面的示例仅在变量环境不是= production时才创建资源。如果Count = 0,那么将不会创建资源,
此致
resource "azurerm_network_security_rule" "web_server_nsg_rule_rdp" {
name = "RDP Inbound"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "3389"
source_address_prefix = "*"
destination_address_prefix = "*"
resource_group_name = "${azurerm_resource_group.web_server_rg.name}"
network_security_group_name = "${azurerm_network_security_group.web_server_nsg.name}"
count = "${var.environment == "production" ? 0 : 1}"
}