Terraform - передача типа Object в качестве параметра в Azure Template Deployment - PullRequest
2 голосов
/ 26 января 2020

Я привязываюсь к предоставлению Azure AD Domain Service с использованием Terraform, предоставляя Terraform Azure ARM шаблон, это потому, что Terrafrom не поддерживает выделенную Azure AD Domain Service изначально.

I экспортировали шаблон ARM и его параметры, один из параметров называется "notificationSettings", который имеет тип Object и выглядит следующим образом:

    "notificationSettings": {
        "value": {
            "notifyGlobalAdmins": "Enabled",
            "notifyDcAdmins": "Enabled",
            "additionalRecipients": []
        }
    }

Все остальные параметры strings, и я могу передать без каких-либо проблем, например:

"apiVersion" = "2017-06-01"

Я попытался передать этот объект параметрам, как показано ниже:

"notificationSettings" = [{
                "notifyGlobalAdmins" = "Enabled"
            "notifyDcAdmins" ="Enabled"
            "additionalRecipients" = []
}]

Однако, когда я выполняю terrafrom apply, terrafrom жалуется и говорит :

Недопустимое значение для атрибута "параметры": элемент "messagesSettings": обязательная строка.

Как передать тип параметра Object в template body?

Я также попытался передать весь параметр ARM json в виде файла для террафа с помощью параметра parameters_body, как показано ниже:

parameters_body = "${file("${path.module}/temp/params.json")}"

, однако я получаю ошибку followig w При выполнении сценария terrafrom:

Содержимое запроса недопустимо и не может быть десериализовано: «Ошибка преобразования значения« https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json# »в тип« Microsoft. WindowsAzure .ResourceStack.Frontdoor.Data.Definitions.DeploymentParameterDefinition. Путь 'properties.parameters. $ Schema', строка 1, позиция 2952. '.

Ниже приведен файл params.json:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "apiVersion": {
            "value": "2017-06-01"
        },
        "sku": {
            "value": "Standard"
        "location": {
            "value": "westus"
        },
        "notificationSettings": {
            "value": {
                "notifyGlobalAdmins": "Enabled",
                "notifyDcAdmins": "Enabled",
                "additionalRecipients": []
            }
        },
        "subnetName": {
            "value": "xxxx"
        },
        "vnetName": {
            "value": "xxxx"
        },
        "vnetAddressPrefixes": {
            "value": [
                "10.0.1.0/24"
            ]
        },
        "subnetAddressPrefix": {
            "value": "10.0.1.0/24"
        },
        "nsgName": {
            "value": "xxxxx"
        }
    }
}

1 Ответ

2 голосов
/ 27 января 2020

Существует способ передачи произвольных структур данных из Terraform в ARM.

Существует два способа передачи данных в шаблон ARM в поставщике azure_template_deployment

  • с помощью * Блок 1006 *, который ограничен только строковыми параметрами
  • , используйте блок parameters_body, который в значительной степени произвольный JSON.

Я считаю, что самый простой способ использовать Блок параметров должен создать локальную переменную с нужной мне структурой, а затем вызвать jsonencode. Мне также нравится хранить шаблон ARM в отдельном файле и извлекать его с помощью вызова file(), уменьшая сложность terraform.

locals {
  location = "string"
  members = [
    "array",
    "of",
    "members"
  ]
  enabled = true
  tags = {
    "key" = "value",
    "simple" = "store"
  }

  # this is the format required by ARM templates
  parameters_body = {
    location = {
      value = "${local.location}"
    },
    properties = {
      value = {
        users = {
          members = "${local.members}"
        }
        boolparameter = "${local.enabled}"
      }
    }
    tags = {
      value = "${module.global.tags}"
    }
  }
}

resource "azurerm_template_deployment" "sample" {
  name = "sample"
  resource_group_name = "rg"
  deployment_mode = "Incremental"
  template_body = "${file("${path.module}/arm/sample_arm.json")}"
  parameter_body = "${jsonencode(local.parameters_body)}"
}

Единственное замечание, которое я обнаружил, заключается в том, что bool параметры передаются в виде строки, поэтому объявите их как строку в разделе параметров ARM, а затем используйте функцию ARM для преобразования в bool

"parameters: {
  "boolParameter": {
     "type": "string"
  }
},
"variables": {
  "boolVariable": "[bool(parameters('boolParameter'))]"
},
"resources": [
  ...
  "boolArm": "[variables('boolVariable')]",
  ...
]
...