Criar e gerenciar VMs Windows no Azure usando C#Create and manage Windows VMs in Azure using C#

Uma VM (Máquina Virtual) do Azure precisa de vários recursos do Azure de suporte.An Azure Virtual Machine (VM) needs several supporting Azure resources. Este artigo aborda a criação, o gerenciamento e a exclusão de recursos de VM utilizando C#.This article covers creating, managing, and deleting VM resources using C#. Você aprenderá como:You learn how to:

  • Criar um projeto do Visual StudioCreate a Visual Studio project
  • Instalar o pacoteInstall the package
  • Criar credenciaisCreate credentials
  • Criar recursosCreate resources
  • Executar outras tarefas de gerenciamentoPerform management tasks
  • Excluir recursosDelete resources
  • Executar o aplicativoRun the application

São necessários cerca de 20 minutos para a conclusão destas etapas.It takes about 20 minutes to do these steps.

Criar um projeto do Visual StudioCreate a Visual Studio project

  1. Se você ainda não fez isso, instale o Visual Studio.If you haven't already, install Visual Studio. Selecione Desenvolvimento para desktop com o .NET na página Cargas de trabalho e, em seguida, clique em Instalar.Select .NET desktop development on the Workloads page, and then click Install. No resumo, é possível verificar que as ferramentas de desenvolvimento do .NET Framework 4 - 4.6 são automaticamente selecionadas.In the summary, you can see that .NET Framework 4 - 4.6 development tools is automatically selected for you. Se o Visual Studio já estiver instalado, você poderá adicionar a carga de trabalho .NET utilizando o Iniciador do Visual Studio.If you have already installed Visual Studio, you can add the .NET workload using the Visual Studio Launcher.
  2. No Visual Studio, clique em Arquivo > Novo > Projeto.In Visual Studio, click File > New > Project.
  3. Em Modelos > Visual C# , selecione Aplicativo de Console (.NET Framework) , digite myDotnetProject para o nome do projeto, selecione o local do projeto e, em seguida, clique em OK.In Templates > Visual C#, select Console App (.NET Framework), enter myDotnetProject for the name of the project, select the location of the project, and then click OK.

Instalar o pacoteInstall the package

Os pacotes NuGet são a maneira mais fácil de instalar as bibliotecas de que você precisa para concluir estas etapas.NuGet packages are the easiest way to install the libraries that you need to finish these steps. Para obter as bibliotecas que você precisa no Visual Studio, siga estas etapas:To get the libraries that you need in Visual Studio, do these steps:

  1. Clique em Ferramentas > Gerenciador de Pacotes Nuget e em Console do Gerenciador de Pacotes.Click Tools > Nuget Package Manager, and then click Package Manager Console.

  2. Digite este comando no console:Type this command in the console:

    Install-Package Microsoft.Azure.Management.Fluent
    

Criar credenciaisCreate credentials

Antes de começar essa etapa, verifique se você tem acesso a uma entidade de serviço do Active Directory.Before you start this step, make sure that you have access to an Active Directory service principal. Além disso, registre o ID do aplicativo, a chave de autenticação e o ID do locatário que serão necessários em uma etapa posterior.You should also record the application ID, the authentication key, and the tenant ID that you need in a later step.

Criar o arquivo de autorizaçãoCreate the authorization file

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em myDotnetProject > Adicionar > Novo Item e, em seguida, selecione Arquivo de Texto em Itens do Visual C# .In Solution Explorer, right-click myDotnetProject > Add > New Item, and then select Text File in Visual C# Items. Nomeie o arquivo azureauth.properties e, em seguida, clique em Adicionar.Name the file azureauth.properties, and then click Add.

  2. Adicione estas propriedades de autorização:Add these authorization 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.windows.net/
    

    Substitua <subscription-id> pelo identificador da assinatura, <application-id> pelo identificador de aplicativo do Active Directory, <authentication-key> pela chave do aplicativo e <tenant-id> pelo identificador do locatário.Replace <subscription-id> with your subscription identifier, <application-id> with the Active Directory application identifier, <authentication-key> with the application key, and <tenant-id> with the tenant identifier.

  3. Salve o arquivo azureauth.properties.Save the azureauth.properties file.

  4. Defina uma variável de ambiente no Windows chamada AZURE_AUTH_LOCATION com o caminho completo para o arquivo de autorização que você criou.Set an environment variable in Windows named AZURE_AUTH_LOCATION with the full path to authorization file that you created. Por exemplo, o seguinte comando do PowerShell pode ser usado:For example, the following PowerShell command can be used:

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

Criar o cliente de gerenciamentoCreate the management client

  1. Abra o arquivo Program.cs para o projeto que você criou.Open the Program.cs file for the project that you created. Em seguida, adicione o seguinte usando instruções para as instruções existentes na parte superior do arquivo:Then, add these using statements to the existing statements at top of the file:

    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;
    
  2. Para criar o cliente de gerenciamento, adicione este código ao método Main:To create the management client, add this code to the Main method:

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

Criar recursosCreate resources

Criar o grupo de recursosCreate the resource group

Todos os recursos devem estar contidos em um Grupo de recursos.All resources must be contained in a Resource group.

Para especificar valores para o aplicativo e criar o grupo de recursos, adicione este código ao método Main:To specify values for the application and create the resource group, add this code to the Main method:

var groupName = "myResourceGroup";
var vmName = "myVM";
var location = Region.USWest;
    
Console.WriteLine("Creating resource group...");
var resourceGroup = azure.ResourceGroups.Define(groupName)
    .WithRegion(location)
    .Create();

Criar o conjunto de disponibilidadeCreate the availability set

Os conjuntos de disponibilidade facilitam a manutenção das máquinas virtuais usadas por seu aplicativo.Availability sets make it easier for you to maintain the virtual machines used by your application.

Para criar o conjunto de disponibilidade, adicione este código ao método Main:To create the availability set, add this code to the Main method:

Console.WriteLine("Creating availability set...");
var availabilitySet = azure.AvailabilitySets.Define("myAVSet")
    .WithRegion(location)
    .WithExistingResourceGroup(groupName)
    .WithSku(AvailabilitySetSkuTypes.Managed)
    .Create();

Criar um endereço IP públicoCreate the public IP address

Um endereço IP público é necessário para se comunicar com a máquina virtual.A Public IP address is needed to communicate with the virtual machine.

Para criar o endereço IP público para a máquina virtual, adicione este código ao método Main:To create the public IP address for the virtual machine, add this code to the Main method:

Console.WriteLine("Creating public IP address...");
var publicIPAddress = azure.PublicIPAddresses.Define("myPublicIP")
    .WithRegion(location)
    .WithExistingResourceGroup(groupName)
    .WithDynamicIP()
    .Create();

Criar a rede virtualCreate the virtual network

Uma máquina virtual precisa estar em uma sub-rede de uma Rede virtual.A virtual machine must be in a subnet of a Virtual network.

Para criar uma sub-rede e uma rede virtual, adicione este código ao método Main:To create a subnet and a virtual network, add this code to the Main method:

Console.WriteLine("Creating virtual network...");
var network = azure.Networks.Define("myVNet")
    .WithRegion(location)
    .WithExistingResourceGroup(groupName)
    .WithAddressSpace("10.0.0.0/16")
    .WithSubnet("mySubnet", "10.0.0.0/24")
    .Create();

Criar a interface de redeCreate the network interface

Uma máquina virtual precisa de uma interface de rede para se comunicar na rede virtual.A virtual machine needs a network interface to communicate on the virtual network.

Para criar um adaptador de rede, adicione este código ao método Main:To create a network interface, add this code to the Main method:

Console.WriteLine("Creating network interface...");
var networkInterface = azure.NetworkInterfaces.Define("myNIC")
    .WithRegion(location)
    .WithExistingResourceGroup(groupName)
    .WithExistingPrimaryNetwork(network)
    .WithSubnet("mySubnet")
    .WithPrimaryPrivateIPAddressDynamic()
    .WithExistingPrimaryPublicIPAddress(publicIPAddress)
    .Create();

Criar a máquina virtualCreate the virtual machine

Agora que você criou todos os recursos de suporte, você pode criar uma máquina virtual.Now that you created all the supporting resources, you can create a virtual machine.

Para criar a máquina virtual, adicione este código ao método Main:To create the virtual machine, add this code to the Main method:

Console.WriteLine("Creating virtual machine...");
azure.VirtualMachines.Define(vmName)
    .WithRegion(location)
    .WithExistingResourceGroup(groupName)
    .WithExistingPrimaryNetworkInterface(networkInterface)
    .WithLatestWindowsImage("MicrosoftWindowsServer", "WindowsServer", "2012-R2-Datacenter")
    .WithAdminUsername("azureuser")
    .WithAdminPassword("Azure12345678")
    .WithComputerName(vmName)
    .WithExistingAvailabilitySet(availabilitySet)
    .WithSize(VirtualMachineSizeTypes.StandardDS1)
    .Create();

Observação

Este tutorial cria uma máquina virtual executando uma versão do sistema operacional do Windows Server.This tutorial creates a virtual machine running a version of the Windows Server operating system. Para saber mais sobre a seleção de outras imagens, veja Navegar e selecionar imagens de máquina virtual do Azure com o Windows PowerShell e a CLI do Azure.To learn more about selecting other images, see Navigate and select Azure virtual machine images with Windows PowerShell and the Azure CLI.

Se você quiser usar um disco existente em vez de uma imagem do marketplace, use este código:If you want to use an existing disk instead of a marketplace image, use this code:

var managedDisk = azure.Disks.Define("myosdisk")
    .WithRegion(location)
    .WithExistingResourceGroup(groupName)
    .WithWindowsFromVhd("https://mystorage.blob.core.windows.net/vhds/myosdisk.vhd")
    .WithSizeInGB(128)
    .WithSku(DiskSkuTypes.PremiumLRS)
    .Create();

azure.VirtualMachines.Define("myVM")
    .WithRegion(location)
    .WithExistingResourceGroup(groupName)
    .WithExistingPrimaryNetworkInterface(networkInterface)
    .WithSpecializedOSDisk(managedDisk, OperatingSystemTypes.Windows)
    .WithExistingAvailabilitySet(availabilitySet)
    .WithSize(VirtualMachineSizeTypes.StandardDS1)
    .Create();

Executar tarefas de gerenciamentoPerform management tasks

Durante o ciclo de vida de uma máquina virtual, é possível que você queira executar tarefas de gerenciamento, como inicialização, interrupção ou exclusão de uma máquina virtual.During the lifecycle of a virtual machine, you may want to run management tasks such as starting, stopping, or deleting a virtual machine. Além disso, é possível que você queira criar um código para automatizar tarefas complexas ou repetitivas.Additionally, you may want to create code to automate repetitive or complex tasks.

Quando você precisa fazer alguma coisa com a VM, você precisa obter uma instância dela:When you need to do anything with the VM, you need to get an instance of it:

var vm = azure.VirtualMachines.GetByResourceGroup(groupName, vmName);

Obter informações sobre a VMGet information about the VM

Para obter informações sobre a máquina virtual, adicione este código ao método Main:To get information about the virtual machine, add this code to the Main method:

Console.WriteLine("Getting information about the virtual machine...");
Console.WriteLine("hardwareProfile");
Console.WriteLine("   vmSize: " + vm.Size);
Console.WriteLine("storageProfile");
Console.WriteLine("  imageReference");
Console.WriteLine("    publisher: " + vm.StorageProfile.ImageReference.Publisher);
Console.WriteLine("    offer: " + vm.StorageProfile.ImageReference.Offer);
Console.WriteLine("    sku: " + vm.StorageProfile.ImageReference.Sku);
Console.WriteLine("    version: " + vm.StorageProfile.ImageReference.Version);
Console.WriteLine("  osDisk");
Console.WriteLine("    osType: " + vm.StorageProfile.OsDisk.OsType);
Console.WriteLine("    name: " + vm.StorageProfile.OsDisk.Name);
Console.WriteLine("    createOption: " + vm.StorageProfile.OsDisk.CreateOption);
Console.WriteLine("    caching: " + vm.StorageProfile.OsDisk.Caching);
Console.WriteLine("osProfile");
Console.WriteLine("  computerName: " + vm.OSProfile.ComputerName);
Console.WriteLine("  adminUsername: " + vm.OSProfile.AdminUsername);
Console.WriteLine("  provisionVMAgent: " + vm.OSProfile.WindowsConfiguration.ProvisionVMAgent.Value);
Console.WriteLine("  enableAutomaticUpdates: " + vm.OSProfile.WindowsConfiguration.EnableAutomaticUpdates.Value);
Console.WriteLine("networkProfile");
foreach (string nicId in vm.NetworkInterfaceIds)
{
    Console.WriteLine("  networkInterface id: " + nicId);
}
Console.WriteLine("vmAgent");
Console.WriteLine("  vmAgentVersion" + vm.InstanceView.VmAgent.VmAgentVersion);
Console.WriteLine("    statuses");
foreach (InstanceViewStatus stat in vm.InstanceView.VmAgent.Statuses)
{
    Console.WriteLine("    code: " + stat.Code);
    Console.WriteLine("    level: " + stat.Level);
    Console.WriteLine("    displayStatus: " + stat.DisplayStatus);
    Console.WriteLine("    message: " + stat.Message);
    Console.WriteLine("    time: " + stat.Time);
}
Console.WriteLine("disks");
foreach (DiskInstanceView disk in vm.InstanceView.Disks)
{
    Console.WriteLine("  name: " + disk.Name);
    Console.WriteLine("  statuses");
    foreach (InstanceViewStatus stat in disk.Statuses)
    {
        Console.WriteLine("    code: " + stat.Code);
        Console.WriteLine("    level: " + stat.Level);
        Console.WriteLine("    displayStatus: " + stat.DisplayStatus);
        Console.WriteLine("    time: " + stat.Time);
    }
}
Console.WriteLine("VM general status");
Console.WriteLine("  provisioningStatus: " + vm.ProvisioningState);
Console.WriteLine("  id: " + vm.Id);
Console.WriteLine("  name: " + vm.Name);
Console.WriteLine("  type: " + vm.Type);
Console.WriteLine("  location: " + vm.Region);
Console.WriteLine("VM instance status");
foreach (InstanceViewStatus stat in vm.InstanceView.Statuses)
{
    Console.WriteLine("  code: " + stat.Code);
    Console.WriteLine("  level: " + stat.Level);
    Console.WriteLine("  displayStatus: " + stat.DisplayStatus);
}
Console.WriteLine("Press enter to continue...");
Console.ReadLine();

Pare a VM.Stop the VM

Você pode parar uma máquina virtual e manter todas as suas configurações, mas continuará a ser cobrado por ela, ou pode parar uma máquina virtual e desalocá-la.You can stop a virtual machine and keep all its settings, but continue to be charged for it, or you can stop a virtual machine and deallocate it. Quando uma máquina virtual é desalocada, todos os recursos associados a ela também são desalocadas e a cobrança para eles termina.When a virtual machine is deallocated, all resources associated with it are also deallocated and billing ends for it.

Para interromper a máquina virtual sem desalocá-la, adicione este código ao método Main:To stop the virtual machine without deallocating it, add this code to the Main method:

Console.WriteLine("Stopping vm...");
vm.PowerOff();
Console.WriteLine("Press enter to continue...");
Console.ReadLine();

Se você desejar desalocar a máquina virtual, altere a chamada PowerOff para este código:If you want to deallocate the virtual machine, change the PowerOff call to this code:

vm.Deallocate();

Iniciar a VMStart the VM

Para iniciar a máquina virtual, adicione este código ao método Main:To start the virtual machine, add this code to the Main method:

Console.WriteLine("Starting vm...");
vm.Start();
Console.WriteLine("Press enter to continue...");
Console.ReadLine();

Redimensionar a VMResize the VM

Muitos aspectos da implantação devem ser considerados ao decidir sobre um tamanho para sua máquina virtual.Many aspects of deployment should be considered when deciding on a size for your virtual machine. Para obter mais informações, consulte Tamanhos de VM.For more information, see VM sizes.

Para alterar o tamanho da máquina virtual, adicione este código ao método Main:To change size of the virtual machine, add this code to the Main method:

Console.WriteLine("Resizing vm...");
vm.Update()
    .WithSize(VirtualMachineSizeTypes.StandardDS2) 
    .Apply();
Console.WriteLine("Press enter to continue...");
Console.ReadLine();

Adicionar um disco de dados à VMAdd a data disk to the VM

Para adicionar um disco de dados para a máquina virtual, adicione este código ao método Main.To add a data disk to the virtual machine, add this code to the Main method. Este exemplo adiciona um disco de dados é de 2 GB de tamanho, tem um LUN de 0 e um tipo de cache de ReadWrite:This example adds a data disk that is 2 GB in size, han a LUN of 0 and a caching type of ReadWrite:

Console.WriteLine("Adding data disk to vm...");
vm.Update()
    .WithNewDataDisk(2, 0, CachingTypes.ReadWrite) 
    .Apply();
Console.WriteLine("Press enter to delete resources...");
Console.ReadLine();

Excluir recursosDelete resources

Como você é cobrado pelos recursos utilizados no Azure, sempre é uma boa prática excluir os recursos que não são mais necessários.Because you are charged for resources used in Azure, it is always good practice to delete resources that are no longer needed. Se você quiser excluir as máquinas virtuais e todos os recursos de suporte, tudo o que precisa fazer é excluir o grupo de recursos.If you want to delete the virtual machines and all the supporting resources, all you have to do is delete the resource group.

Para excluir o grupo de recursos, adicione este código ao método Main:To delete the resource group, add this code to the Main method:

azure.ResourceGroups.DeleteByName(groupName);

Executar o aplicativoRun the application

Devem ser necessários cerca de cinco minutos para o aplicativo de console executar completamente do início ao fim.It should take about five minutes for this console application to run completely from start to finish.

  1. Para executar o aplicativo de console, clique em Iniciar.To run the console application, click Start.

  2. Antes de pressionar Enter para iniciar a exclusão de recursos, reserve alguns minutos para verificar a criação dos recursos no portal do Azure.Before you press Enter to start deleting resources, you could take a few minutes to verify the creation of the resources in the Azure portal. Clique no status de implantação para ver informações sobre a implantação.Click the deployment status to see information about the deployment.

Próximas etapasNext steps