Как проверить шаблон ARM с помощью azure .net SDK или Fluent API?

Как проверить загруженный шаблон ARM с помощью azure .net SDK или Fluent API? Я хочу проверить загруженный шаблон ARM, например портал Azure, с помощью azure .net SDK или Fluent API? Для справки см. ниже изображение. Azure показывает сообщение, если шаблон ARM недействителен, поэтому то же самое я хочу реализовать с помощью любого .net API или REST API.

введите здесь описание изображения

@Jim Ниже ошибка, которую я получаю:

введите здесь описание изображения


person DnyaneshSurya    schedule 21.04.2021    source источник
comment
docs.microsoft.com/en-us/learn/modules /рука-шаблон-тест   -  person gunr2171    schedule 21.04.2021
comment
@gunr2171 gunr2171 спасибо за ответ, но это не относится ко мне.   -  person DnyaneshSurya    schedule 21.04.2021
comment
Have you referred to docs.microsoft.com/en-us/dotnet/api/   -  person Jim Xu    schedule 22.04.2021


Ответы (1)


Если вы хотите проверить шаблон руки, выполните следующие действия.

  1. Создайте субъект-службу и назначьте роль участника sp
az ad sp create-for-rbac -n "MyApp"
  1. Установить пакет
Install-Package Microsoft.Azure.Management.ResourceManager.Fluent -Version 1.34.0
  1. Код
 string clientId = "23****9c";
            string clientSecret = "?s****/k";
            string tenantDomain = "";
            string subscription = "";
            var creds= SdkContext.AzureCredentialsFactory.FromServicePrincipal(clientId, clientSecret, tenantDomain, AzureEnvironment.AzureGlobalCloud);
            var restClient = RestClient.Configure()
                .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
                .WithCredentials(creds)
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.BodyAndHeaders)
                .Build();


            ResourceManagementClient managementClient = new ResourceManagementClient(restClient);
            managementClient.SubscriptionId = subscription;

            //Validates whether the specified template is syntactically correct and will be accepted by Azure Resource Manager..
            DeploymentValidateResultInner res = await managementClient.Deployments.ValidateAsync("<groupName>", "<deployName>", new DeploymentInner()
            {
                Location = "",
                Properties = new DeploymentProperties()
                {
                    ParametersLink = new ParametersLink("uri"),
                    TemplateLink = new TemplateLink("")
                }
            });

            Console.WriteLine(res.Error.Message);

            // get changes that will be made by the deployment if executed at the scope of resource group
            WhatIfOperationResultInner res1 = await  managementClient.Deployments.WhatIfAsync("<groupName>", "<deployName>", new DeploymentWhatIf() { 
                  Location="",
                   Properties= new DeploymentWhatIfProperties() {
                       ParametersLink = new ParametersLink("uri"),
                       TemplateLink = new TemplateLink("")
                   }
            });

            foreach (var change in res1.Changes) {
               // 
            }
person Jim Xu    schedule 22.04.2021
comment
Спасибо за ответ. У меня есть шаблон ARM и файл параметров, и я передаю их напрямую, а не с ParametersLink , TemplateLink, но получаю. Содержимое запроса было недопустимым и не могло быть десериализовано. - person DnyaneshSurya; 22.04.2021
comment
@DnyaneshSurya Не могли бы вы подробно описать сообщение об ошибке? - person Jim Xu; 23.04.2021
comment
Содержимое запроса было недопустимым и не могло быть десериализовано: «Ошибка преобразования значения {$schema:schema.management.azure.com/schemas/2015-01-01/{type:Microsoft.DevTestLab/schedules,apiVersion:2017 -04-26-preview,name:[ipient:[parameters('autoShutdownNotificationEmail')]},targetResourceId:[resourceId('Microsoft.Compute/virtualMachines', parameters('vmName'))]}}]} для ввода ' Azure.Deployments.Templates.Schema.Template». Путь 'properties.template', строка 4, позиция 1419.'. - person DnyaneshSurya; 23.04.2021
comment
Я обновил свой вопрос и прикрепил еще одно изображение, чтобы вы могли получить информацию об ошибке. - person DnyaneshSurya; 23.04.2021
comment
@DnyaneshSurya, пожалуйста, попробуйте определить шаблон и параметр как Jobject. Дополнительные сведения см. на странице gist.github.com/ramnov/2c3fae176435e3b5bff19a905657c6a2. - person Jim Xu; 23.04.2021
comment
Спасибо за ответ. Да, он работает после определения шаблона и параметра как Jobject. Но в случае недопустимого шаблона. Если я передаю действительный шаблон, то res.Error.Message выдает System.NullReferenceException: «Ссылка на объект не указывает на экземпляр объекта». Не могли бы вы помочь мне в этом? - person DnyaneshSurya; 23.04.2021
comment
@DnyaneshSurya Что касается ошибки, я предлагаю вам попытаться уловить ваш запрос, чтобы подробно проверить ошибку. - person Jim Xu; 23.04.2021