Развертывание виртуальной машины Azure с помощью C# и шаблона Resource Manager
В этой статье описывается развертывание шаблона Azure Resource Manager с помощью C#. Созданный шаблон развертывает одну виртуальную машину под управлением Windows Server в новой виртуальной сети с одной подсетью.
Подробное описание ресурса виртуальной машины см. в статье Виртуальные машины в шаблоне Azure Resource Manager. Дополнительные сведения обо всех ресурсах в шаблоне см. в статье Пошаговое руководство по созданию шаблона Resource Manager.
На выполнение этих действий требуется примерно 10 минут.
Создание проекта Visual Studio
На этом шаге нужно убедиться, что экземпляр Visual Studio установлен, и создать консольное приложение, используемое для развертывания шаблона.
- Если вы этого еще не сделали, установите Visual Studio. На странице рабочих нагрузок выберите Разработка классических приложений .NET и нажмите кнопку Установить. В сводке вы увидите, что средства разработки .NET Framework 4–4.6 выберутся автоматически. Если вы уже установили Visual Studio, можно добавить рабочую нагрузку .NET с помощью средства запуска Visual Studio.
- В Visual Studio выберите Файл>Создать>Проект.
- В разделе Шаблоны>Visual C# выберите пункт Консольное приложение (.NET Framework) , укажите имя myDotnetProject и расположение проекта, а затем нажмите кнопку OK.
Установка пакетов
Самый простой способ установить библиотеки, необходимые для выполнения этих инструкций, — это использовать пакеты NuGet. Чтобы получить эти библиотеки в Visual Studio, выполните следующие действия.
Щелкните Сервис>Диспетчер пакетов NuGet, а затем — Консоль диспетчера пакетов.
В консоли введите следующие команды:
Install-Package Microsoft.Azure.Management.Fluent Install-Package WindowsAzure.Storage
Создание файлов
На этом шаге вы создадите файл шаблона, который развертывает ресурсы, и файл параметров, который предоставляет значения для параметров шаблона. Кроме того, вы создадите файл авторизации для выполнения операций Azure Resource Manager.
Создание файла шаблона
В обозревателе решений щелкните правой кнопкой мыши myDotnetProject>Добавить>Новый элемент и в списке Элементы Visual C# выберите Текстовый файл. Назовите файл CreateVMTemplate.json, а затем щелкните Добавить.
Добавьте следующий код JSON в созданный файл:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "adminUsername": { "type": "string" }, "adminPassword": { "type": "securestring" } }, "variables": { "vnetID": "[resourceId('Microsoft.Network/virtualNetworks','myVNet')]", "subnetRef": "[concat(variables('vnetID'),'/subnets/mySubnet')]", }, "resources": [ { "apiVersion": "2016-03-30", "type": "Microsoft.Network/publicIPAddresses", "name": "myPublicIPAddress", "location": "[resourceGroup().location]", "properties": { "publicIPAllocationMethod": "Dynamic", "dnsSettings": { "domainNameLabel": "myresourcegroupdns1" } } }, { "apiVersion": "2016-03-30", "type": "Microsoft.Network/virtualNetworks", "name": "myVNet", "location": "[resourceGroup().location]", "properties": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "subnets": [ { "name": "mySubnet", "properties": { "addressPrefix": "10.0.0.0/24" } } ] } }, { "apiVersion": "2016-03-30", "type": "Microsoft.Network/networkInterfaces", "name": "myNic", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Network/publicIPAddresses/', 'myPublicIPAddress')]", "[resourceId('Microsoft.Network/virtualNetworks/', 'myVNet')]" ], "properties": { "ipConfigurations": [ { "name": "ipconfig1", "properties": { "privateIPAllocationMethod": "Dynamic", "publicIPAddress": { "id": "[resourceId('Microsoft.Network/publicIPAddresses','myPublicIPAddress')]" }, "subnet": { "id": "[variables('subnetRef')]" } } } ] } }, { "apiVersion": "2016-04-30-preview", "type": "Microsoft.Compute/virtualMachines", "name": "myVM", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Network/networkInterfaces/', 'myNic')]" ], "properties": { "hardwareProfile": { "vmSize": "Standard_DS1" }, "osProfile": { "computerName": "myVM", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]" }, "storageProfile": { "imageReference": { "publisher": "MicrosoftWindowsServer", "offer": "WindowsServer", "sku": "2012-R2-Datacenter", "version": "latest" }, "osDisk": { "name": "myManagedOSDisk", "caching": "ReadWrite", "createOption": "FromImage" } }, "networkProfile": { "networkInterfaces": [ { "id": "[resourceId('Microsoft.Network/networkInterfaces','myNic')]" } ] } } } ] }
Сохраните файл CreateVMTemplate.json.
Создание файла параметров
Чтобы задать значения для параметров ресурсов в шаблоне, создайте файл параметров, содержащий эти значения.
В обозревателе решений щелкните правой кнопкой мыши myDotnetProject>Добавить>Новый элемент и в списке Элементы Visual C# выберите Текстовый файл. Назовите файл Parameters.json, а затем щелкните Добавить.
Добавьте следующий код JSON в созданный файл:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json", "contentVersion": "1.0.0.0", "parameters": { "adminUserName": { "value": "azureuser" }, "adminPassword": { "value": "Azure12345678" } } }
Сохраните файл Parameters.json.
Создание файла авторизации
Перед развертыванием шаблона убедитесь в наличии доступа к субъекту-службе Active Directory. Субъект-служба предоставляет маркер для аутентификации запросов к Azure Resource Manager. Кроме того, необходимо записать идентификатор приложения, ключ проверки подлинности и идентификатор клиента, которые понадобятся в файле авторизации.
В обозревателе решений щелкните правой кнопкой мыши myDotnetProject>Добавить>Новый элемент и в списке Элементы Visual C# выберите Текстовый файл. Назовите файл azureauth.properties и щелкните Добавить.
Добавьте следующие свойства авторизации:
subscription=<subscription-id> client=<application-id> key=<authentication-key> tenant=<tenant-id> managementURI=https://management.core.windows.net/ baseURL=https://management.azure.com/ authURL=https://login.windows.net/ graphURL=https://graph.microsoft.com/
Замените <subscription-id> своим идентификатором подписки, <application-id> — идентификатором приложения Active Directory, <authentication-key> — ключом приложения, а <tenant-id> — идентификатором клиента.
Сохраните файл azureauth.properties.
Задайте переменную среды в Windows с именем AZURE_AUTH_LOCATION с полным путем к файлу авторизации, созданному вами. Например, можно использовать такую команду PowerShell:
[Environment]::SetEnvironmentVariable("AZURE_AUTH_LOCATION", "C:\Visual Studio 2019\Projects\myDotnetProject\myDotnetProject\azureauth.properties", "User")
Создание клиента управления
Откройте файл Program.cs для созданного проекта. Затем добавьте указанные ниже инструкции using к уже существующим инструкциям в начале файла.
using Microsoft.Azure.Management.Compute.Fluent; using Microsoft.Azure.Management.Compute.Fluent.Models; using Microsoft.Azure.Management.Fluent; using Microsoft.Azure.Management.ResourceManager.Fluent; using Microsoft.Azure.Management.ResourceManager.Fluent.Core; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob;
Чтобы создать клиент управления, добавьте следующий код в метод Main:
var credentials = SdkContext.AzureCredentialsFactory .FromFile(Environment.GetEnvironmentVariable("AZURE_AUTH_LOCATION")); var azure = Azure .Configure() .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic) .Authenticate(credentials) .WithDefaultSubscription();
Создание группы ресурсов
Чтобы задать значения для приложения, добавьте код в метод Main:
var groupName = "myResourceGroup";
var location = Region.USWest;
var resourceGroup = azure.ResourceGroups.Define(groupName)
.WithRegion(location)
.Create();
Создание учетной записи хранения
Шаблон и параметры развертываются из учетной записи хранения в Azure. На этом шаге создается учетная запись и отправляются файлы.
Чтобы создать учетную запись, добавьте следующий код в метод Main:
string storageAccountName = SdkContext.RandomResourceName("st", 10);
Console.WriteLine("Creating storage account...");
var storage = azure.StorageAccounts.Define(storageAccountName)
.WithRegion(Region.USWest)
.WithExistingResourceGroup(resourceGroup)
.Create();
var storageKeys = storage.GetKeys();
string storageConnectionString = "DefaultEndpointsProtocol=https;"
+ "AccountName=" + storage.Name
+ ";AccountKey=" + storageKeys[0].Value
+ ";EndpointSuffix=core.windows.net";
var account = CloudStorageAccount.Parse(storageConnectionString);
var serviceClient = account.CreateCloudBlobClient();
Console.WriteLine("Creating container...");
var container = serviceClient.GetContainerReference("templates");
container.CreateIfNotExistsAsync().Wait();
var containerPermissions = new BlobContainerPermissions()
{ PublicAccess = BlobContainerPublicAccessType.Container };
container.SetPermissionsAsync(containerPermissions).Wait();
Console.WriteLine("Uploading template file...");
var templateblob = container.GetBlockBlobReference("CreateVMTemplate.json");
templateblob.UploadFromFileAsync("..\\..\\CreateVMTemplate.json").Result();
Console.WriteLine("Uploading parameters file...");
var paramblob = container.GetBlockBlobReference("Parameters.json");
paramblob.UploadFromFileAsync("..\\..\\Parameters.json").Result();
Развертывание шаблона
Разверните шаблон и параметры из созданной учетной записи хранения.
Для развертывания шаблона добавьте следующий код в метод Main.
var templatePath = "https://" + storageAccountName + ".blob.core.windows.net/templates/CreateVMTemplate.json";
var paramPath = "https://" + storageAccountName + ".blob.core.windows.net/templates/Parameters.json";
var deployment = azure.Deployments.Define("myDeployment")
.WithExistingResourceGroup(groupName)
.WithTemplateLink(templatePath, "1.0.0.0")
.WithParametersLink(paramPath, "1.0.0.0")
.WithMode(Microsoft.Azure.Management.ResourceManager.Fluent.Models.DeploymentMode.Incremental)
.Create();
Console.WriteLine("Press enter to delete the resource group...");
Console.ReadLine();
Удаление ресурсов
Так как за использование ресурсов Azure взимается плата, рекомендуется всегда удалять ресурсы, которые больше не нужны. Не нужно отдельно удалять каждый ресурс из группы ресурсов. Удалите группу ресурсов, и все ее ресурсы будут автоматически удалены.
Чтобы удалить группу ресурсов, добавьте следующий код в метод Main:
azure.ResourceGroups.DeleteByName(groupName);
Выполнение приложения
На полное выполнение этого консольного приложения потребуется примерно 5 минут.
Чтобы запустить консольное приложение, щелкните Запустить.
Прежде чем нажать клавишу ВВОД и начать удаление ресурсов, потратьте несколько минут и проверьте на портале Azure, созданы ли эти ресурсы. Щелкните состояние развертывания, чтобы просмотреть сведения о развертывании.
Дальнейшие действия
- При наличии проблем с развертыванием ознакомьтесь с информацией об устранении распространенных ошибок при развертывании Azure с помощью Azure Resource Manager.
- Узнайте, как развернуть виртуальную машину и ее вспомогательные ресурсы, ознакомившись с разделом Развертывание ресурсов Azure с помощью языка C#.