使用Terraform模块时如何“覆盖”某些资源参数?

时间:2018-10-22 17:37:18

标签: terraform

我正在尝试开发通用的terraform模块以支持数据狗监视器,并允许模块的用户在侧面通用模块中附加资源和/或覆盖资源。

terraform overrides功能在没有模块的情况下可以正常工作,但在使用模块时则无法工作。

如何覆盖模块内部的某些资源参数?

要求:

  1. /modules/datadog/monitors.tf 包含资源列表,每个资源代表具有默认参数值的通用datadog监视器。每个单个应用都可以选择覆盖每个资源中的一个或多个参数。

  2. /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不会覆盖资源,而是将两者都视为不同的资源。

1 个答案:

答案 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}"  
}