Переменная шаблона Azure ARM: получение свойства имени подписки

#azure #arm-template

#azure #arm-template

Вопрос:

Есть ли способ получить имя текущей подписки в переменной?

Что-то вроде этого:

   "variables": {
     "Purpose":  "[subscription().SubscriptionName]"
  },
 

Visual Studio сообщает, что «Свойство «подписки» должно быть одним из следующих: id, subscriptionId, TenantId». Таким образом, вышеуказанное не будет работать.

Я также нашел несколько примеров функции «ссылка» и попытался использовать ее таким образом:

 "variables": {
   "SubName": "[reference('/subscriptions/subscription().subscriptionId','2015-01-01').outputs.name.value]"
},
 

Но при вызове шаблона он выдает ошибку:

 function 'reference' is not expected at this location
 

Я не уверен, куда я должен его поместить и как я получаю его в переменную.

В PowerShell я мог бы сделать это: (Get-AzureRmSubscription).subscriptionname

Для интересующего нас пакета у нас есть несколько подписок. Имя подписки содержит 3-значный «короткий код», который используется для присвоения имен группам ресурсов в рамках данной подписки. Это не служит никакой другой цели, кроме упрощения определения того, что к чему относится. Это часть нашего соглашения об именовании, чтобы помочь администраторам (которые не особенно знакомы с Azure) легко увидеть, какие ресурсы где находятся. Я знаю, что есть другие способы, такие как RBAC и т. Д., Но непрерывный сбор файлов cookie учетных данных Microsoft не позволяет входить в систему с разными учетными данными для разных подписок.

Спасибо W.

Ответ №1:

На момент написания этого ответа (16 октября 2016 года) Боюсь, вы не сможете.

Согласно документам, это то, что возвращает subscription():

 {
   "id": "/subscriptions/#####",
   "subscriptionId": "#####",
   "tenantId": "#####"
}
 

Поэтому вам следует ожидать сбоя subscription().SubscriptionName .

В том же документе, на который я ссылался, есть обсуждение этого в разделе комментариев, см. Комментарий # 2694777590, где Microsoft говорит:

Хорошо — я добавил ошибку для добавления атрибута name в выражение subscription().

это было 6 июня 2016 года, так что, я думаю, это уже в пути.

В качестве обходного пути вы можете ввести имя подписки из объекта, который выполняет шаблон. Например, если это PowerShell, вы могли бы сделать

 $subName = (Get-AzureRmSubscription).subscriptionname
New-AzureRmResourceGroupDeployment ... -SecscriptionName $subName
 

Кроме того, я не знаю, какова цель этой манипуляции со строками на основе имени подписки, о котором вы говорили, но если требуется создать уникальные имена в области подписки, рекомендуется использовать uniqueString(subscription().subscriptionId) как часть имени.

Комментарии:

1. Спасибо @itaysk. Я обновил свой вопрос дополнительной информацией. После недавнего решения по дизайну после встречи с Microsoft мы решили отказаться от PS (поскольку это, по-видимому, «старый» способ) и использовать шаблоны JSON. Пока функция не будет добавлена, я буду использовать PS для создания имен ресурсов.

Ответ №2:

Вы должны иметь возможность использовать:

 subscription().displayName
 

(Я получу сообщение об ошибке в поведении VS)

Ответ №3:

Я смог приступить subscription().subscriptionId к работе с переменной моего шаблона.

Я думаю, что эта ошибка, которую вы видите, является результатом того, как Azure считывает шаблон. Согласно справочной документации Microsoft, ссылки нельзя использовать в переменных:

Примечания

Ссылочная функция получает свое значение из состояния времени выполнения и, следовательно, не может использоваться в разделе переменные.

Я получал то же function 'reference' is not expected at this location самое, пока не переместил свой фактический ссылочный вызов в тело шаблона.

Ответ №4:

subscription() displayName Согласно документации, у now есть дополнительный атрибут.

Для вас должно сработать следующее:

 "variables": {
    "Purpose": "[subscription().displayName]"
}