Wdrażanie maszyny wirtualnej platformy Azure przy użyciu języka C# i Resource Manager szablonu

W tym artykule pokazano, jak wdrożyć szablon usługi Azure Resource Manager użyciu języka C#. Szablon, który utworzysz, wdraża pojedynczą maszynę wirtualną z systemem Windows Server w nowej sieci wirtualnej z pojedynczą podsiecią.

Aby uzyskać szczegółowy opis zasobu maszyny wirtualnej, zobacz Virtual machines in an Azure Resource Manager template (Maszyny wirtualne w szablonie usługi Azure Resource Manager Wirtualne). Aby uzyskać więcej informacji na temat wszystkich zasobów w szablonie, zobacz Przewodnik po szablonie Resource Manager Azure.

Te kroki potrwają około 10 minut.

Tworzenie projektu programu Visual Studio

W tym kroku upewnisz się, że Visual Studio zainstalowana aplikacja konsolowa i aplikacja konsolowa używana do wdrażania szablonu.

  1. Jeśli nie zostało to jeszcze zainstalowane, zainstaluj Visual Studio. Wybierz pozycję Tworzenie aplikacji klasycznych dla programu .NET na stronie Obciążenia, a następnie kliknij przycisk Zainstaluj. W podsumowaniu widać, że automatycznie .NET Framework 4–4.6 narzędzi deweloperskie. Jeśli masz już zainstalowane Visual Studio, możesz dodać obciążenie .NET przy użyciu aplikacji Visual Studio Launcher.
  2. W Visual Studio kliknij pozycję PlikNowy>>Project.
  3. W pozycji>SzablonyVisual C# wybierz pozycję Aplikacja konsoli (.NET Framework),wprowadź nazwę projektu myDotnetProject, wybierz lokalizację projektu, a następnie kliknij przycisk OK.

Instalowanie pakietów

NuGet to najprostszy sposób instalowania bibliotek potrzebnych do ukończenia tych kroków. Aby uzyskać biblioteki potrzebne w programie Visual Studio, wykonaj następujące kroki:

  1. Kliknij pozycjęNarzędziaNarzędzia> Menedżer pakietów, a następnie kliknij pozycję Menedżer pakietów Konsoli.

  2. Wpisz następujące polecenia w konsoli:

    Install-Package Microsoft.Azure.Management.Fluent
    Install-Package WindowsAzure.Storage
    

Tworzenie plików

W tym kroku utworzysz plik szablonu, który wdraża zasoby, oraz plik parametrów, który dostarcza wartości parametrów do szablonu. Utworzysz również plik autoryzacji, który jest używany do wykonywania operacji Resource Manager Azure.

Tworzenie pliku szablonu

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję myDotnetProjectAddNowy>>element, a następnie wybierz pozycję Plik tekstowy w elementach Visual C#. Nadaj plikowi nazwę CreateVMTemplate.json, a następnie kliknij przycisk Dodaj.

  2. Dodaj ten kod JSON do utworzonego pliku:

    {
      "$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')]"
                }
              ]
            }
          }
        }
      ]
    }
    
  3. Zapisz plik CreateVMTemplate.json.

Tworzenie pliku parametrów

Aby określić wartości parametrów zasobów w szablonie, należy utworzyć plik parametrów zawierający wartości.

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję myDotnetProjectAddNowy>>element, a następnie wybierz pozycję Plik tekstowy w elementach Visual C#. Nadaj plikowi nazwę Parameters.json, a następnie kliknij przycisk Dodaj.

  2. Dodaj ten kod JSON do utworzonego pliku:

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUserName": { "value": "azureuser" },
        "adminPassword": { "value": "Azure12345678" }
      }
    }
    
  3. Zapisz plik Parameters.json.

Tworzenie pliku autoryzacji

Przed wdrożeniem szablonu upewnij się, że masz dostęp do jednostki usługi Active Directory. Z jednostki usługi uzyskujesz token do uwierzytelniania żądań do usługi Azure Resource Manager. Należy również zarejestrować identyfikator aplikacji, klucz uwierzytelniania i identyfikator dzierżawy, których potrzebujesz w pliku autoryzacji.

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję myDotnetProjectAddNowy>>element, a następnie wybierz pozycję Plik tekstowy w elementach Visual C#. Nadaj plikowi nazwę azureauth.properties, a następnie kliknij przycisk Dodaj.

  2. Dodaj następujące właściwości autoryzacji:

    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/
    

    Zastąp <element subscription-id> identyfikatorem subskrypcji, <identyfikatorem aplikacji> identyfikatorem aplikacji usługi Active Directory, <kluczem> uwierzytelniania kluczem aplikacji, <a identyfikator dzierżawy> identyfikatorem dzierżawy.

  3. Zapisz plik azureauth.properties.

  4. Ustaw zmienną środowiskową w Windows o nazwie AZURE_AUTH_LOCATION pełną ścieżką do utworzonego pliku autoryzacji, na przykład możesz użyć następującego polecenia programu PowerShell:

    [Environment]::SetEnvironmentVariable("AZURE_AUTH_LOCATION", "C:\Visual Studio 2019\Projects\myDotnetProject\myDotnetProject\azureauth.properties", "User")
    

Tworzenie klienta zarządzania

  1. Otwórz plik Program.cs dla utworzonego projektu. Następnie dodaj te instrukcje using do istniejących instrukcji w górnej części pliku:

    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;
    
  2. Aby utworzyć klienta zarządzania, dodaj ten kod do metody Main:

    var credentials = SdkContext.AzureCredentialsFactory
        .FromFile(Environment.GetEnvironmentVariable("AZURE_AUTH_LOCATION"));
    
    var azure = Azure
        .Configure()
        .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
        .Authenticate(credentials)
        .WithDefaultSubscription();
    

Tworzenie grupy zasobów

Aby określić wartości dla aplikacji, dodaj kod do metody Main:

var groupName = "myResourceGroup";
var location = Region.USWest;

var resourceGroup = azure.ResourceGroups.Define(groupName)
    .WithRegion(location)
    .Create();

Tworzenie konta magazynu

Szablon i parametry są wdrażane z konta magazynu na platformie Azure. W tym kroku utworzysz konto i przekażemy pliki.

Aby utworzyć konto, dodaj ten kod do metody 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();

Wdrożenie szablonu

Wd wdrażaj szablon i parametry z utworzonego konta magazynu.

Aby wdrożyć szablon, dodaj ten kod do metody 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();

Usuwanie zasobów

Ponieważ opłaty są naliczane za zasoby używane na platformie Azure, zawsze dobrym rozwiązaniem jest usunięcie zasobów, które nie są już potrzebne. Nie musisz usuwać każdego zasobu oddzielnie od grupy zasobów. Usuń grupę zasobów, a wszystkie jej zasoby zostaną automatycznie usunięte.

Aby usunąć grupę zasobów, dodaj ten kod do metody Main:

azure.ResourceGroups.DeleteByName(groupName);

Uruchamianie aplikacji

Całkowite uruchomienie tej aplikacji konsolowej od początku do końca powinno zająć około pięciu minut.

  1. Aby uruchomić aplikację konsolowa, kliknij przycisk Uruchom.

  2. Przed naciśnięciem klawisza Enter w celu rozpoczęcia usuwania zasobów może potrwać kilka minut, aby zweryfikować utworzenie zasobów w Azure Portal. Kliknij stan wdrożenia, aby wyświetlić informacje o wdrożeniu.

Następne kroki