azure - 如何在terraform中编写if/else语句来部署特定资源

标签 azure terraform infrastructure-as-code

我正在尝试在 Terraform 中编写一个 if 语句来部署或不部署特定资源,并努力使其正常工作。

我想使用 if 语句部署一个名为 AzureFirewallSubnet 的子网。如果条件为true,并且如果条件为false,则不部署,并且目前我无法让它工作。

ma​​in.tf

resource "azurerm_virtual_network" "vnet" {
    name = var.vnet.name
    location = var.rg.location
    resource_group_name = var.rg.name
    address_space = var.vnet.address_space  

    subnet {
        count = "${var.afw_subnet.enabled == true ? 1 : 0}"
        name = var.subnets.subnet1.name
        address_prefix = var.subnets.subnet1.address_prefix
    }
}

参数.tf

# Virtual Network Paramters
variable "vnet" {
    default = {
        name = "vnet-uks-prod-hub-01"
        address_space = ["10.0.0.0/16"]
    }
}

# Azure Firewall
variable "afw_subnet" {
    default = {
        enabled = true
    }
}

# Subnet Parameters
variable "subnets" {
    type = map
    default = {
        subnet1 = {
            name = "AzureFirewallSubnet"
            address_prefix = "10.0.0.0/26"
        }
    }
}

错误

 Error: Unsupported argument
 
   on vnet-hub/vnet_hub.tf line 15, in resource "azurerm_virtual_network" "vnet":
   15:         count = "${var.afw_subnet.enabled == true ? 1 : 0}"
 
 An argument named "count" is not expected here.

##[error]Terraform command 'validate' failed with exit code '1'.

如果有更好的方法在不使用计数的情况下做到这一点,如果有人能指出我正确的方向,那就太好了。

最佳答案

看起来像 dynamic block应该可以带你到达那里。

resource "azurerm_virtual_network" "vnet" {
  name                = var.vnet.name
  location            = var.rg.location
  resource_group_name = var.rg.name
  address_space       = var.vnet.address_space


  dynamic "subnet" {
    for_each = var.afw_subnet.enabled ? [1] : []

    content {
      name           = var.subnets.subnet1.name
      address_prefix = var.subnets.subnet1.address_prefix
    }
  }
}

更好的方法是为子网中给出的每个子网添加一个这样的 block 。像这样:

resource "azurerm_virtual_network" "vnet" {
  name                = var.vnet.name
  location            = var.rg.location
  resource_group_name = var.rg.name
  address_space       = var.vnet.address_space


  dynamic "subnet" {
    for_each = var.subnets

    content {
      name           = subnet.name
      address_prefix = subnet.address_prefix
    }
  }
}

关于azure - 如何在terraform中编写if/else语句来部署特定资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75617141/

相关文章:

amazon-web-services - AWS 和 Terraform - 安全组中的默认导出规则

amazon-web-services - 您能否将 S3 存储桶触发器从以前的函数移至无服务器框架中的新函数?

在数据库的单元测试中 Azure 管道托管代理与 Azure SQL 数据库的连接

google-cloud-platform - Terraform:Cloud Run 服务上的云端点?

amazon-web-services - terraform 计数取决于来自目标环境的数据

azure - Terraform 计划输出显示 2 个更新到位

azure - 在 Azure 中部署 Web 角色

python - azure 管道中的 pip install azure-functions 因 pip 验证任务而失败

authentication - 报告服务身份验证问题

azure - 嵌套资源不能出现在带有 for 表达式的资源内部