根据'azurerm_postgresql_flexible_server'的变量有条件地配置高可用性

sqxo8psd  于 2022-12-14  发布在  PostgreSQL
关注(0)|答案(2)|浏览(91)

我正在用terraform配置我的服务器。对于非生产环境,我们的sku不允许高可用性,但在生产环境中,我们的sku允许。
出于某种原因,high_availability.mode只接受“ZoneRedundant”值以实现高可用性,但不接受任何其他值(根据文档)。根据var.isProd是否为真,我希望打开和关闭高可用性,但我该如何操作呢?

resource "azurerm_postgresql_flexible_server" "default" {
  name                   = "example-${var.env}-postgresql-server"
  location               = azurerm_resource_group.default.location
  resource_group_name    = azurerm_resource_group.default.name
  version                = "14"
  administrator_login    = "sqladmin"
  administrator_password = random_password.postgresql_server.result

  geo_redundant_backup_enabled = var.isProd
  backup_retention_days        = var.isProd ? 60 : 7

  storage_mb = 32768

  high_availability {
    mode = "ZoneRedundant"
  }

  sku_name = var.isProd ? "B_Standard_B2s" : "B_Standard_B1ms"
}
brgchamk

brgchamk1#

我认为此资源的默认分配将是禁用HA,因此管理HA的不是参数mode,而是存在high_availability块。因此,您可以通过排除该块以接受默认“禁用”来管理HA,或者包括该块以使用值ZoneRedundant将HA管理为启用:

dynamic "high_availability" {
  for_each = var.isProd ? ["this"] : []
  
  content {
    mode = "ZoneRedundant"
  }
}

我对API端点参数默认值做了一些假设,所以这需要用Azure帐户进行验收测试。但是,Azure Postgres Flexible Server的文档通常声称HA实际上默认情况下是禁用的,所以这应该可以正常工作。

d5vmydt9

d5vmydt92#

如果您在terraform中使用azurerm provider部署flexible server,它将只接受highavailability.modeZoneRedundant值,而且使用此提供程序,您只能部署sql server版本[11 12 13]。
在terraform中使用Azapi provider时,您可以将highavailability值与“Disabled”、“ZoneRedundant”或“SameZone”中的任何一个一起使用
根据您的要求,我创建了下面的示例terraform脚本,它具有一个环境变量,仅接受prod或非prod值。使用此值,将使用相应的属性部署更灵活的服务器。

  • 如果环境值为prod,则脚本将部署具有高可用性的灵活服务器(如zone redundant),并在启用地理冗余备份的情况下将备份保留期设置为35天。
  • 如果环境值为non-prod,则脚本将部署具有高可用性的灵活服务器disabled,并将备份保留期设置为7天,同时使用地理冗余备份disabled
    以下是Terraform脚本
terraform {
  required_providers {
    azapi = {
      source = "azure/azapi"
    }
  }
}

provider "azapi" {
}

variable "environment" {
    type = string

    validation {
      condition = anytrue([var.environment == "prod",var.environment=="non-prod"])
      error_message = "you havent defined any of allowed values"
    }
}

resource "azapi_resource" "rg" {
  type = "Microsoft.Resources/resourceGroups@2021-04-01"
  name     = "teststackhub"
  location = "eastus"
  parent_id = "/subscriptions/<subscriptionId>"
}

resource "azapi_resource" "test" {
  type = "Microsoft.DBforPostgreSQL/flexibleServers@2022-01-20-preview"
  name                   = "example-${var.environment}-postgresql-server"
  location               = azapi_resource.rg.location
  parent_id = azapi_resource.rg.id
  body = jsonencode({
    properties= {
      administratorLogin="azureuser"
      administratorLoginPassword="<password>"
    backup = {
        backupRetentionDays = var.environment=="prod"?35:7
        geoRedundantBackup = var.environment=="prod"?"Enabled":"Disabled"
      }
      storage={
        storageSizeGB=32
      }
      highAvailability={
        mode= var.environment=="prod"?"ZoneRedundant":"Disabled"
      }
      version = "14"
    }
    sku={
        name = var.environment=="prod" ? "Standard_B2s" : "Standard_B1ms"
        tier = "GeneralPurpose"
      }
  })
}

注意:以上terraform示例脚本供您参考,请根据您的业务需求进行更改。

相关问题