#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
вместо использования переменной.