Использовать локальное значение в variables.tf

#terraform #terraform-provider-azure #hcl

#терраформирование #terraform-поставщик-azure #hcl

Вопрос:

Как использовать локальное значение в variables.tf ?

Мне нужно динамически присвоить значение пороговому значению для двух предупреждений о метрике объема netapp, и я получаю сообщение об ошибке : Error: Variables not allowed . Каждый том NetApp имеет разную квоту хранилища в ГБ, поэтому он должен быть динамическим.

Код тома NetApp:

main.tf

 locals {
  iops_80 = format("%.0f", (var.storage_quota_in_gb * 1.6))
}

resource "azurerm_netapp_volume" "netapp_volume" {
  name                = var.netapp_vol_name
  resource_group_name = var.resource_group_name
  location            = var.location
  account_name        = var.account_name
  pool_name           = var.pool_name
  volume_path         = var.volume_path
  service_level       = var.service_level
  subnet_id           = var.subnet_id
  storage_quota_in_gb = var.storage_quota_in_gb
  protocols           = var.protocols

  dynamic "export_policy_rule" {
    for_each = var.export_policy_rules
    content {
      rule_index        = export_policy_rule.value.rule_index
      allowed_clients   = export_policy_rule.value.allowed_clients
      protocols_enabled = export_policy_rule.value.protocols_enabled
      unix_read_only    = export_policy_rule.value.unix_read_only
      unix_read_write   = export_policy_rule.value.unix_read_write
    }
  }

  tags = var.tags
}

resource "azurerm_monitor_metric_alert" "alert" {
  depends_on = [azurerm_netapp_volume.netapp_volume]

  count               = length(var.criteria)
  name                = "HPG-ALRT-${var.netapp_vol_name}-001-${element(keys(var.criteria), count.index)}"
  resource_group_name = var.resource_group_name
  scopes              = [azurerm_netapp_volume.netapp_volume.id]
  enabled             = var.enabled
  auto_mitigate       = var.auto_mitigate
  description         = lookup(var.criteria, element(keys(var.criteria), count.index), null)["description"]
  frequency           = var.frequency
  severity            = lookup(var.criteria, element(keys(var.criteria), count.index), null)["severity"]
  window_size         = var.window_size

  criteria {
    metric_namespace = lookup(var.criteria, element(keys(var.criteria), count.index), null)["metric_namespace"]
    metric_name      = lookup(var.criteria, element(keys(var.criteria), count.index), null)["metric_name"]
    aggregation      = lookup(var.criteria, element(keys(var.criteria), count.index), null)["aggregation"]
    operator         = lookup(var.criteria, element(keys(var.criteria), count.index), null)["operator"]
    threshold        = lookup(var.criteria, element(keys(var.criteria), count.index), null)["threshold"]
  }

  action {
    action_group_id = var.action_group_id
  }
}
 

variables.tf

     variable "criteria" {
  type = map
  default = {
    "ReadLATENCY5" = {
      metric_namespace = "Microsoft.NetApp/netAppAccounts/capacityPools/volumes"
      metric_name      = "AverageReadLatency"
      aggregation      = "Average"
      operator         = "GreaterThan"
      threshold        = 5
      description      = "NetApp: Volume Read Latency over 5ms"
      severity         = 2
    },
    "ReadIOPS80" = {
      metric_namespace = "Microsoft.NetApp/netAppAccounts/capacityPools/volumes"
      metric_name      = "ReadIops"
      aggregation      = "Average"
      operator         = "GreaterThan"
      threshold        = local.iops_80
      description      = "NetApp: Volume Read IOPS over TBD"
      severity         = 2
    },
    "WriteIops80" = {
      metric_namespace = "Microsoft.NetApp/netAppAccounts/capacityPools/volumes"
      metric_name      = "WriteIops"
      aggregation      = "Average"
      operator         = "GreaterThan"
      threshold        = local.iops_80
      description      = "NetApp: Volume Write IOPS over TBD"
      severity         = 2
    },
  }
}
 

Один из способов — выполнить другое сопоставление критериев, чтобы определять только оповещения со значением iops_80 и назначать его в main.tf но есть ли какой-нибудь другой способ сделать это?

Комментарии:

1. Что я сделал для временного решения, так это добавил условный оператор threshold = (element(keys(var.criteria), count.index) == "ReadIOPS80" || element(keys(var.criteria), count.index) == "WriteIOPS80") ? (lookup(var.criteria, element(keys(var.criteria), count.index), null)["threshold"] local.iops_80) : lookup(var.criteria, element(keys(var.criteria), count.index), null)["threshold"]

2. Вы когда-нибудь устанавливали var.criteria с terraform.tfvars помощью или TF_VAR_criteria ? Если нет, вы также можете сделать это локальным.

3. Вы имеете в виду, что хотите использовать локальный в variables.tf ?

4. @ydaetskcoR это модуль, я не использую там terraform.tfvars.

5. @CharlesXu Да, именно так.

Ответ №1:

Кажется, вы не можете использовать локальные значения в файле переменных. Что вы можете сделать, так это использовать переменные в локальном и использовать локальное значение и переменные в блоке ресурсов. И вы также можете использовать локальные значения в другом локальном.

Поэтому я думаю, что вам нужно использовать переменные для установки входных данных, и все будет изменено. И заключите переменные в кавычки в local или укажите local в другом local. Например, может быть, вы можете использовать local для установки criteria вместо использования переменной.