Azure: создание шаблонов: как извлечь defaultStorageAccount
Я пытаюсь создать собственное изображение в моем Azure DevTestLab из образа VHD, хранящегося в учетной записи хранения по умолчанию.
Я начал изменять файл в репозитории GitHub для шаблонов ARM для создания собственного образа из VHD.
Я уже создал лабораторию DevTest, и я могу запустить следующую команду Powershell, чтобы получить ее данные:
PS C:\git> $rid = Get-AzureRmResource -ResourceGroupName jgTl9-rg -ResourceType Microsoft.DevTestLab/labs -ResourceName jgTl9 -ApiVersion 2016-05-15
Это дает кучу информации. Если я хочу извлечь имя учетной записи хранения по умолчанию, я делаю следующее:
PS C:\git> $rid.properties.defaultStorageAccount
Я знаю, что это возможно. Теперь я изменил раздел переменных шаблона сборки Azure (файл JSON), чтобы он выглядел следующим образом:
"variables": {
"resourceName": "[concat(variables('existingLabName'), '/', variables('imageName'))]",
"resourceType": "Microsoft.DevTestLab/labs/customimages",
"existingLabName": "[replace(resourceGroup().name,'-rg','')]",
"storageAccountID": "/subscriptions/xxxxxxxxxxxx/resourceGroups/jgTl9-rg/providers/Microsoft.Storage/storageAccounts/djgtl91795",
"saidFrags": "[skip(split(variables('storageAccountID'), '/' ), add(length(split(variables('storageAccountID'), '/' )),-1) ) ]",
"storageAccountSuffix": "[take(variables('saidFrags'),1)[0]]",
"existingVhdUri": "[concat('https://',variables('storageAccountSuffix'),'.blob.core.windows.net/uploads/',parameters('imageFileName'))]",
"imageName": "JaysImage"
},
Этот код действительно работает, когда я вызываю команду New-AzureRmResourceGroupDeployment с azuredeploy.json и azuredeploy.parameters.json.
Однако вместо жесткого кодирования переменной storageAccountID я хотел бы извлечь defaultStorageAccount из среды. Я попробовал что-то вроде этого:
"storageAccountID": "[string( resourceId(resourceGroup().name,'MicrosoftDevTestLab/labs','jgTl9').properties.defaultStorageAccount ))",
Я попробовал несколько вариантов этого, но ничего не получалось. Какой синтаксис мне нужно использовать для извлечения той же информации, что я жестко запрограммировал для storageAccountID?
(Я не смог найти ничего в описании функций шаблона в Microsoft).
1 ответ
Пара вопросов с вашим следующим выражением
"storageAccountID": "[string( resourceId(resourceGroup().name,'MicrosoftDevTestLab/labs','jgTl9').properties.defaultStorageAccount ))",
- Существует проблема синтаксиса, т.е. дополнительный
)
в конце. - Поставщик ресурсов
MicrosoftDevTestlab/labs
должно бытьMicrosoft.DevTestlab/labs
- когда
resourceId
используется, это не даст вам весь объект. Итак, когда вы делаетеproperties.defaultStorageAccount
она не будет работать. Потому что он дает вам только строку вашей тестовой лаборатории разработчика и ничего больше, и на строке нет свойстваdefaultStorageAccount
,
Теперь вам нужно reference
функция как ниже
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
},
"variables": {
"vDefaultStorageAccount": "[string(resourceId('yourResourceGroupName','Microsoft.DevTestLab/labs','yourTestLabName'))]"
},
"resources": [],
"outputs": {
"defaultStorageAccount":{
"value": "[reference(variables('vDefaultStorageAccount'),'2016-05-15').defaultStorageAccount]",
"type":"string"
}
}
}
В переменной vDefaultStorageAccount
мы получаем идентификатор DevTestLab
а потом мы используем reference
функция, чтобы получить объект. Тогда вы можете сделать .
чтобы получить свойства. Например, вам не нужно указывать properties.defaultStorageAccount.