Tworzenie maszyn wirtualnych z systemem Windows i zarządzanie nimi na platformie Azure przy użyciu języka Java

Dotyczy: ✔️ maszyny wirtualne z systemem Windows

Maszyna wirtualna platformy Azure wymaga kilku zasobów pomocniczych platformy Azure. W tym artykule opisano tworzenie i usuwanie zasobów maszyn wirtualnych oraz zarządzanie nimi przy użyciu języka Java. Nauczysz się, jak:

  • Tworzenie projektu Maven
  • Dodawanie zależności
  • Utwórz poświadczenia
  • Tworzenie zasobów
  • Wykonywanie zadań zarządzania
  • Usuwanie zasobów
  • Uruchamianie aplikacji

Wykonanie tych kroków zajmuje około 20 minut.

Tworzenie projektu Maven

  1. Jeśli jeszcze tego nie zrobiono, zainstaluj środowisko Java.

  2. Zainstaluj narzędzie Maven.

  3. Utwórz nowy folder i projekt:

    mkdir java-azure-test
    cd java-azure-test
    
    mvn archetype:generate -DgroupId=com.fabrikam -DartifactId=testAzureApp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    

Dodawanie zależności

  1. W folderze testAzureApp otwórz plik pom.xml i dodaj konfigurację kompilacji do <projektu> aby umożliwić kompilowanie aplikacji:

    <build>
      <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.fabrikam.testAzureApp.App</mainClass>
            </configuration>
        </plugin>
      </plugins>
    </build>
    
  2. Dodaj zależności wymagane do uzyskania dostępu do zestawu Azure Java SDK.

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-identity</artifactId>
      <version>1.3.6</version>
    </dependency>
    <dependency>
      <groupId>com.azure.resourcemanager</groupId>
      <artifactId>azure-resourcemanager</artifactId>
      <version>2.8.0</version>
    </dependency>
    
  3. Zapisz plik.

Konfigurowanie uwierzytelniania

Dowiedz się, jak skonfigurować uwierzytelnianie.

Tworzenie klienta zarządzania

  1. App.java Otwórz plik w obszarze src\main\java\com\fabrikam i upewnij się, że ta instrukcja pakietu znajduje się u góry:

    package com.fabrikam.testAzureApp;
    
  2. Tworzenie AzureResourceManager:

    TokenCredential credential = new EnvironmentCredentialBuilder()
                .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                .build();
    
    // Please finish 'Set up authentication' step first to set the four environment variables: AZURE_SUBSCRIPTION_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID
    AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
    
    AzureResourceManager azureResourceManager = AzureResourceManager.configure()
            .withLogLevel(HttpLogDetailLevel.BASIC)
            .authenticate(credential, profile)
            .withDefaultSubscription();
    

Tworzenie zasobów

Tworzenie grupy zasobów

Wszystkie zasoby muszą znajdować się w grupie zasobów.

Aby określić wartości aplikacji i utworzyć grupę zasobów, dodaj ten kod do bloku try w metodzie main:

System.out.println("Creating resource group...");
ResourceGroup resourceGroup = azure.resourceGroups()
    .define("myResourceGroup")
    .withRegion(Region.US_EAST)
    .create();

Tworzenie zestawu dostępności

Zestawy dostępności ułatwiają konserwację maszyn wirtualnych używanych przez aplikację.

Aby utworzyć zestaw dostępności, dodaj ten kod do bloku try w metodzie main:

System.out.println("Creating availability set...");
AvailabilitySet availabilitySet = azure.availabilitySets()
    .define("myAvailabilitySet")
    .withRegion(Region.US_EAST)
    .withExistingResourceGroup("myResourceGroup")
    .create();

Tworzenie publicznego adresu IP

Publiczny adres IP jest wymagany do komunikowania się z maszyną wirtualną.

Aby utworzyć publiczny adres IP maszyny wirtualnej, dodaj ten kod do bloku try w metodzie main:

System.out.println("Creating public IP address...");
PublicIpAddress publicIPAddress = azure.publicIpAddresses()
    .define("myPublicIP")
    .withRegion(Region.US_EAST)
    .withExistingResourceGroup("myResourceGroup")
    .withDynamicIP()
    .create();

Tworzenie sieci wirtualnej

Maszyna wirtualna musi znajdować się w podsieci sieci wirtualnej.

Aby utworzyć podsieć i sieć wirtualną, dodaj ten kod do bloku try w metodzie main:

System.out.println("Creating virtual network...");
Network network = azure.networks()
    .define("myVN")
    .withRegion(Region.US_EAST)
    .withExistingResourceGroup("myResourceGroup")
    .withAddressSpace("10.0.0.0/16")
    .withSubnet("mySubnet", "10.0.0.0/24")
    .create();

Tworzenie interfejsu sieciowego

Maszyna wirtualna wymaga interfejsu sieciowego do komunikacji w sieci wirtualnej.

Aby utworzyć interfejs sieciowy, dodaj ten kod do bloku try w metodzie main:

System.out.println("Creating network interface...");
NetworkInterface networkInterface = azure.networkInterfaces()
    .define("myNIC")
    .withRegion(Region.US_EAST)
    .withExistingResourceGroup("myResourceGroup")
    .withExistingPrimaryNetwork(network)
    .withSubnet("mySubnet")
    .withPrimaryPrivateIPAddressDynamic()
    .withExistingPrimaryPublicIPAddress(publicIPAddress)
    .create();

Tworzenie maszyny wirtualnej

Po utworzeniu wszystkich zasobów pomocniczych możesz utworzyć maszynę wirtualną.

Aby utworzyć maszynę wirtualną, dodaj ten kod do bloku try w metodzie main:

System.out.println("Creating virtual machine...");
VirtualMachine virtualMachine = azure.virtualMachines()
    .define("myVM")
    .withRegion(Region.US_EAST)
    .withExistingResourceGroup("myResourceGroup")
    .withExistingPrimaryNetworkInterface(networkInterface)
    .withLatestWindowsImage("MicrosoftWindowsServer", "WindowsServer", "2012-R2-Datacenter")
    .withAdminUsername("azureuser")
    .withAdminPassword("Azure12345678")
    .withComputerName("myVM")
    .withExistingAvailabilitySet(availabilitySet)
    .withSize("Standard_DS1")
    .create();
Scanner input = new Scanner(System.in);
System.out.println("Press enter to get information about the VM...");
input.nextLine();

Uwaga

W tym samouczku zostanie utworzona maszyna wirtualna z uruchomioną wersją systemu operacyjnego Windows Server. Aby dowiedzieć się więcej na temat wybierania innych obrazów, zobacz Navigate and select Azure virtual machine images with Windows PowerShell and the Azure CLI (Nawigowanie i wybieranie obrazów maszyn wirtualnych platformy Azure przy użyciu programu Windows PowerShell i interfejsu wiersza polecenia platformy Azure).

Jeśli chcesz użyć istniejącego dysku zamiast obrazu witryny Marketplace, użyj tego kodu:

Disk managedDisk = azure.disks().define("myosdisk")
    .withRegion(Region.US_EAST)
    .withExistingResourceGroup("myResourceGroup")
    .withWindowsFromVhd("https://mystorage.blob.core.windows.net/vhds/myosdisk.vhd")
    .withStorageAccountName("mystorage")
    .withSizeInGB(128)
    .withSku(DiskSkuTypes.PREMIUM_LRS)
    .create();

azure.virtualMachines().define("myVM")
    .withRegion(Region.US_EAST)
    .withExistingResourceGroup("myResourceGroup")
    .withExistingPrimaryNetworkInterface(networkInterface)
    .withSpecializedOSDisk(managedDisk, OperatingSystemTypes.WINDOWS)
    .withExistingAvailabilitySet(availabilitySet)
    .withSize(VirtualMachineSizeTypes.STANDARD_DS1)
    .create();

Wykonywanie zadań zarządzania

W trakcie cyklu życia maszyny wirtualnej można uruchamiać zadania zarządzania, takie jak uruchamianie, zatrzymywanie lub usuwanie maszyny wirtualnej. Ponadto możesz utworzyć kod w celu zautomatyzowania powtarzających się lub złożonych zadań.

Jeśli musisz zrobić cokolwiek z maszyną wirtualną, najpierw uzyskaj jej instancję. Dodaj ten kod do bloku try metody main:

VirtualMachine vm = azure.virtualMachines().getByResourceGroup("myResourceGroup", "myVM");

Uzyskiwanie informacji o maszynie wirtualnej

Aby uzyskać informacje o maszynie wirtualnej, dodaj ten kod do bloku try w metodzie main:

System.out.println("hardwareProfile");
System.out.println("    vmSize: " + vm.size());
System.out.println("storageProfile");
System.out.println("  imageReference");
System.out.println("    publisher: " + vm.storageProfile().imageReference().publisher());
System.out.println("    offer: " + vm.storageProfile().imageReference().offer());
System.out.println("    sku: " + vm.storageProfile().imageReference().sku());
System.out.println("    version: " + vm.storageProfile().imageReference().version());
System.out.println("  osDisk");
System.out.println("    osType: " + vm.storageProfile().osDisk().osType());
System.out.println("    name: " + vm.storageProfile().osDisk().name());
System.out.println("    createOption: " + vm.storageProfile().osDisk().createOption());
System.out.println("    caching: " + vm.storageProfile().osDisk().caching());
System.out.println("osProfile");
System.out.println("    computerName: " + vm.osProfile().computerName());
System.out.println("    adminUserName: " + vm.osProfile().adminUsername());
System.out.println("    provisionVMAgent: " + vm.osProfile().windowsConfiguration().provisionVMAgent());
System.out.println(
        "    enableAutomaticUpdates: " + vm.osProfile().windowsConfiguration().enableAutomaticUpdates());
System.out.println("networkProfile");
System.out.println("    networkInterface: " + vm.primaryNetworkInterfaceId());
System.out.println("vmAgent");
System.out.println("  vmAgentVersion: " + vm.instanceView().vmAgent().vmAgentVersion());
System.out.println("    statuses");
for (InstanceViewStatus status : vm.instanceView().vmAgent().statuses()) {
    System.out.println("    code: " + status.code());
    System.out.println("    displayStatus: " + status.displayStatus());
    System.out.println("    message: " + status.message());
    System.out.println("    time: " + status.time());
}
System.out.println("disks");
for (DiskInstanceView disk : vm.instanceView().disks()) {
    System.out.println("  name: " + disk.name());
    System.out.println("  statuses");
    for (InstanceViewStatus status : disk.statuses()) {
        System.out.println("    code: " + status.code());
        System.out.println("    displayStatus: " + status.displayStatus());
        System.out.println("    time: " + status.time());
    }
}
System.out.println("VM general status");
System.out.println("  provisioningStatus: " + vm.provisioningState());
System.out.println("  id: " + vm.id());
System.out.println("  name: " + vm.name());
System.out.println("  type: " + vm.type());
System.out.println("VM instance status");
for (InstanceViewStatus status : vm.instanceView().statuses()) {
    System.out.println("  code: " + status.code());
    System.out.println("  displayStatus: " + status.displayStatus());
}
System.out.println("Press enter to continue...");
input.nextLine();

Zatrzymaj maszynę wirtualną

Możesz zatrzymać maszynę wirtualną i zachować wszystkie jej ustawienia, ale nadal będą naliczane opłaty, lub możesz zatrzymać maszynę wirtualną i zdealokować ją. Gdy maszyna wirtualna zostanie zwolniona, wszystkie skojarzone z nią zasoby również zostaną zwolnione i zakończy się naliczanie opłat.

Aby zatrzymać maszynę wirtualną bez dezasocjowania, dodaj ten kod do bloku try w metodzie main:

System.out.println("Stopping vm...");
vm.powerOff();
System.out.println("Press enter to continue...");
input.nextLine();

Jeśli chcesz cofnąć przydział maszyny wirtualnej, zmień wywołanie usługi PowerOff na następujący kod:

vm.deallocate();

Uruchamianie maszyny wirtualnej

Aby uruchomić maszynę wirtualną, dodaj ten kod do bloku try w metodzie main:

System.out.println("Starting vm...");
vm.start();
System.out.println("Press enter to continue...");
input.nextLine();

Zmiana rozmiaru maszyny wirtualnej

Podczas podejmowania decyzji o rozmiarze maszyny wirtualnej należy wziąć pod uwagę wiele aspektów wdrażania. Aby uzyskać więcej informacji, zobacz Rozmiary maszyn wirtualnych.

Aby zmienić rozmiar maszyny wirtualnej, dodaj ten kod do bloku try w metodzie main:

System.out.println("Resizing vm...");
vm.update()
    .withSize(VirtualMachineSizeTypes.STANDARD_DS2)
    .apply();
System.out.println("Press enter to continue...");
input.nextLine();

Dodawanie dysku danych do maszyny wirtualnej

Aby dodać dysk danych do maszyny wirtualnej o rozmiarze 2 GB, ma numer LUN 0 i typ buforowania ReadWrite, dodaj ten kod do bloku try w metodzie main:

System.out.println("Adding data disk...");
vm.update()
    .withNewDataDisk(2, 0, CachingTypes.READ_WRITE)
    .apply();
System.out.println("Press enter to delete resources...");
input.nextLine();

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. Jeśli chcesz usunąć maszyny wirtualne i wszystkie zasoby pomocnicze, wystarczy usunąć grupę zasobów.

  1. Aby usunąć grupę zasobów, dodaj ten kod do bloku try w metodzie main:

    System.out.println("Deleting resources...");
    azure.resourceGroups().deleteByName("myResourceGroup");
    
  2. Zapisz plik App.java.

Uruchamianie aplikacji

Uruchomienie tej aplikacji konsolowej powinno potrwać około pięciu minut od początku do końca.

  1. Aby uruchomić aplikację, użyj tego polecenia narzędzia Maven:

    mvn compile exec:java
    
  2. Zanim naciśniesz Enter aby rozpocząć usuwanie zasobów, możesz poświęcić kilka minut na zweryfikowanie tworzenia zasobów w portalu Azure. Kliknij stan wdrożenia, aby wyświetlić informacje o wdrożeniu.

Następne kroki