【问题标题】:Dynamic data source in Terraform 12Terraform 12 中的动态数据源
【发布时间】:2020-12-14 01:24:31
【问题描述】:

我正在使用 Terraform 在 Azure 中创建警报 (azurerm_monitor_scheduled_query_rules_alert)。您可以包含操作组列表(即您向其发送警报的组)。

在 TFVars 文件中,我将传入操作组名称列表的变量值。但是,警报模块需要资源的 ID,而不是名称。所以我有一个可以获取行动组信息的数据源。然后 Alert 资源可以引用数据源来获取 azure 资源 id。

如果我只有一个操作组,这可以正常工作,但操作组名称列表的大小可能会有所不同。我试图弄清楚如何将所有操作组名称转换为 id 以供资源摄取。

resource "azurerm_monitor_scheduled_query_rules_alert" "tfTestAlertExample" {
for_each = {for alert in var.scheduled_query_alerts : alert.name => alert}

  name                = each.value["name"]
  location            = data.azurerm_resource_group.resource_group.location
  resource_group_name = data.azurerm_resource_group.resource_group.name

  action {

    # --This part here. How do I get make this dynamic?--
    action_group           = [
      data.azurerm_monitor_action_group.action_group.id
    ] 

    email_subject          = each.value["email_subject"]
    custom_webhook_payload = "{}"
  }

  data_source_id = ................ etc

所以在上面的例子中,只有一个 action{} 块,但其中的 Action_group 列表需要是动态的,ID 是从数据源中检索的。或者也许还有另一种我没有考虑过的方法。

任何帮助将不胜感激。

【问题讨论】:

  • 你的意思是这样的:action_group = data.azurerm_monitor_action_group.action_group.*.id 还是action_group = data.azurerm_monitor_action_group.action_group[*].id
  • 这很好,但问题是名称到 id 的转换。不确定我是否可以拥有动态的数据源资源。
  • 所以你想根据组名过滤你的数据源?
  • 即可能是我有 3 个操作组,或者可能是 2 个。如何从动态列表中检索每个操作组的 ID
  • 您可以拥有动态数据源。只需使用for_each,然后在资源中获取 ID。

标签: azure terraform terraform-provider-azure terraform0.12+


【解决方案1】:

如果您只想将操作组名称列表转换为其 Id,您可以这样做:

# declare the variables
variable "action_group_names" {
  default = ["nancyAG1","nancyAG2"]
}

# retrieve the Id of action group
data "azurerm_monitor_action_group" "example" {
  count = length(var.action_group_names)
  resource_group_name = "existingRG"
  name                = element(var.action_group_names,count.index)
}

# output the result to the terminal
output "groups_id" {
  value = data.azurerm_monitor_action_group.example[*].id
  
}

然后像这样将 Ids 传递给资源:

resource "azurerm_monitor_scheduled_query_rules_alert" "example" {
  name                = format("%s-queryrule", var.prefix)
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  action {
    action_group           = data.azurerm_monitor_action_group.example[*].id
    email_subject          = "Email Header"
    custom_webhook_payload = "{}"
  }

检查 action_group Id。

【讨论】:

  • 我最终使用 for_each (如@rkm 建议)而不是 count 做了类似的事情,但在其他方面很像你的例子。谢谢:)
猜你喜欢
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2022-01-04
  • 2022-06-24
相关资源
最近更新 更多