Dela via


Distribuera en virtuell Azure-dator med C# och en Resource Manager mall

Den här artikeln visar hur du distribuerar en Azure Resource Manager mall med C#. Mallen som du skapar distribuerar en enda virtuell dator som kör Windows Server i ett nytt virtuellt nätverk med ett enda undernät.

En detaljerad beskrivning av den virtuella datorresursen finns i Virtuella datorer i en Azure Resource Manager mall. Mer information om alla resurser i en mall finns i genomgången av Azure Resource Manager en mall.

Det tar cirka 10 minuter att göra dessa steg.

Skapa ett Visual Studio-projekt

I det här steget kontrollerar du att Visual Studio har installerats och att du skapar ett konsolprogram som används för att distribuera mallen.

  1. Om du inte redan har gjort det installerar du Visual Studio. Välj .NET-skrivbordsutveckling på sidan Arbetsbelastningar och klicka sedan på Installera. I sammanfattningen ser du att utvecklingsverktygen .NET Framework 4–4.6 väljs automatiskt åt dig. Om du redan har installerat Visual Studio kan du lägga till .NET-arbetsbelastningen med hjälp Visual Studio Launcher.
  2. I Visual Studio klickar du på>ArkivNytt>Project.
  3. I MallarVisual> C# väljer du Konsolapp (.NET Framework), anger myDotnetProject som namn på projektet, väljer platsen för projektet och klickar sedan på OK.

Installera paketen

NuGet-paket är det enklaste sättet att installera de bibliotek som du behöver för att slutföra de här stegen. Så här hämtar du de bibliotek Visual Studio behöver:

  1. Klicka på VerktygNuget>Package Manager och klicka sedan på Package Manager Console.

  2. Skriv följande kommandon i konsolen:

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

Skapa filerna

I det här steget skapar du en mallfil som distribuerar resurserna och en parameterfil som tillhandahåller parametervärden till mallen. Du skapar också en auktoriseringsfil som används för att utföra Azure-Resource Manager åtgärder.

Skapa mallfilen

  1. I Solution Explorer högerklickar du på myDotnetProjectAddNew>>Item och väljer sedan Textfil i Visual C#-objekt. Ge filen namnet CreateVMTemplate.json och klicka sedan på Lägg till.

  2. Lägg till den här JSON-koden i filen som du skapade:

    {
      "$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. Spara filen CreateVMTemplate.json.

Skapa parameterfilen

Om du vill ange värden för resursparametrarna i mallen skapar du en parameterfil som innehåller värdena.

  1. I Solution Explorer högerklickar du på myDotnetProjectAddNew>>Item och väljer sedan Textfil i Visual C#-objekt. Ge filen namnet Parameters.json och klicka sedan på Lägg till.

  2. Lägg till den här JSON-koden i filen som du skapade:

    {
      "$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. Spara filen Parameters.json.

Skapa auktoriseringsfilen

Innan du kan distribuera en mall måste du kontrollera att du har åtkomst till active directory-tjänstens huvudnamn. Från tjänstens huvudnamn hämtar du en token för autentisering av begäranden till Azure Resource Manager. Du bör också registrera program-ID: t, autentiseringsnyckeln och klientorganisations-ID:t som du behöver i auktoriseringsfilen.

  1. I Solution Explorer högerklickar du på myDotnetProjectAddNew>>Item och väljer sedan Textfil i Visual C#-objekt. Ge filen namnet azureauth.properties och klicka sedan på Lägg till.

  2. Lägg till följande auktoriseringsegenskaper:

    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/
    

    Ersätt <subscription-id> med din prenumerations-ID, <program-id> med Active Directory-programidentifieraren,<><autentiseringsnyckeln med programnyckeln och klient-ID>:t med klientorganisations-ID:t.

  3. Spara filen azureauth.properties.

  4. Ange en miljövariabel i Windows med AZURE_AUTH_LOCATION den fullständiga sökvägen till auktoriseringsfilen som du skapade. Du kan till exempel använda följande PowerShell-kommando:

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

Skapa hanteringsklienten

  1. Öppna filen Program.cs för projektet som du skapade. Lägg sedan till dessa using-uttryck till de befintliga -satserna överst i filen:

    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. Lägg till den här koden i Main-metoden för att skapa hanteringsklienten:

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

Skapa en resursgrupp

Om du vill ange värden för programmet lägger du till kod i Main-metoden:

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

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

Skapa ett lagringskonto

Mallen och parametrarna distribueras från ett lagringskonto i Azure. I det här steget skapar du kontot och laddar upp filerna.

Lägg till den här koden i Main-metoden för att skapa kontot:

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();

Distribuera mallen

Distribuera mallen och parametrarna från lagringskontot som skapades.

Om du vill distribuera mallen lägger du till den här koden i Main-metoden:

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();

Ta bort resurserna

Eftersom du debiteras för resurser som används i Azure är det alltid bra att ta bort resurser som inte längre behövs. Du behöver inte ta bort varje resurs separat från en resursgrupp. Ta bort resursgruppen så tas alla dess resurser bort automatiskt.

Om du vill ta bort resursgruppen lägger du till den här koden i Main-metoden:

azure.ResourceGroups.DeleteByName(groupName);

Kör programmet

Det bör ta ungefär fem minuter för konsolprogrammet att köras helt från början till slut.

  1. Om du vill köra konsolprogrammet klickar du på Starta.

  2. Innan du trycker på Retur för att börja ta bort resurser kan det ta några minuter innan du verifierar att resurserna har skapats i Azure Portal. Klicka på distributionsstatusen för att visa information om distributionen.

Nästa steg