Создание виртуальных машин Windows и управление ими в Azure с помощью Java

Область применения: ✔️ Виртуальные машины Windows

Для виртуальной машины Azure (VM) требуется несколько вспомогательных ресурсов Azure. В этой статье описывается создание, управление и удаление ресурсов виртуальной машины с помощью Java. Вы узнаете, как:

  • Создание проекта Maven
  • Добавление зависимостей
  • Создание учетных данных
  • Создание ресурсов
  • Выполнение задач управления
  • Удаление ресурсов
  • Запуск приложения

Для выполнения этих действий требуется около 20 минут.

Создание проекта Maven

  1. Если вы еще этого не сделали, установите Java.

  2. Установите Maven.

  3. Создайте папку и проект:

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

Добавление зависимостей

  1. В папке testAzureApp откройте pom.xml файл и добавьте конфигурацию сборки в <проект> , чтобы включить сборку приложения:

    <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. Добавьте зависимости, необходимые для доступа к пакету SDK для Java Azure.

    <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. Сохраните файл.

Настройка проверки подлинности

Узнайте, как настроить проверку подлинности.

Создание клиента управления

  1. Откройте файл в App.java и src\main\java\com\fabrikam, и убедитесь, что эта инструкция пакета находится в верхней части:

    package com.fabrikam.testAzureApp;
    
  2. Создайте 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();
    

Создание ресурсов

Создание группы ресурсов

Все ресурсы должны содержаться в группе ресурсов.

Чтобы указать значения для приложения и создать группу ресурсов, добавьте этот код в блок try в основном методе:

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

Создайте группу доступности

наборы доступности упрощают обслуживание виртуальных машин, используемых приложением.

Чтобы создать группу доступности, добавьте этот код в блок try в основном методе:

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

Создание общедоступного IP-адреса

Для взаимодействия с виртуальной машиной требуется общедоступный IP-адрес.

Чтобы создать общедоступный IP-адрес виртуальной машины, добавьте этот код в блок try в основном методе:

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

Создание виртуальной сети

Виртуальная машина должна находиться в подсети виртуальной сети.

Чтобы создать подсеть и виртуальную сеть, добавьте этот код в блок try в основном методе:

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

Создание сетевого интерфейса

Виртуальная машина нуждается в сетевом интерфейсе для обмена данными в виртуальной сети.

Чтобы создать сетевой интерфейс, добавьте этот код в блок try в основном методе:

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

Создание виртуальной машины

Теперь, когда вы создали все вспомогательные ресурсы, можно создать виртуальную машину.

Чтобы создать виртуальную машину, добавьте этот код в блок try в основном методе:

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

Примечание.

В этом руководстве создается виртуальная машина под управлением версии операционной системы Windows Server. Дополнительные сведения о выборе других образов см. в статье Навигация и выбор образов виртуальных машин Azure с помощью Windows PowerShell иAzure CLI.

Если вы хотите использовать существующий диск вместо образа Marketplace, используйте следующий код:

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

Выполнение задач управления

Во время жизненного цикла виртуальной машины может потребоваться выполнить такие задачи управления, как запуск, остановка или удаление виртуальной машины. Кроме того, может потребоваться создать код для автоматизации повторяющихся или сложных задач.

Если вам нужно что-либо сделать с виртуальной машиной, необходимо получить экземпляр. Добавьте этот код в блок try основного метода:

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

Получение информации о виртуальной машине

Чтобы получить сведения о виртуальной машине, добавьте этот код в блок try в основном методе:

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

Остановка виртуальной машины

Вы можете остановить виртуальную машину и сохранить все её параметры, но плата за неё продолжает взиматься, или вы можете остановить виртуальную машину и освободить выделенные ресурсы. При освобождении виртуальной машины все ресурсы, связанные с ней, также будут освобождены, а начисление платежей прекращается.

Чтобы остановить виртуальную машину без освобождения ресурсов, добавьте этот код в блок try в основном методе:

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

Если вы хотите освободить виртуальную машину, измените вызов PowerOff на этот код:

vm.deallocate();

Запуск виртуальной машины

Чтобы запустить виртуальную машину, добавьте этот код в блок try в основном методе:

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

Изменение размера виртуальной машины

При выборе размера виртуальной машины следует учитывать множество аспектов развертывания. Для получения дополнительной информации см. Размеры виртуальных машин.

Чтобы изменить размер виртуальной машины, добавьте этот код в блок try в основном методе:

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

Добавление диска данных на виртуальную машину

Чтобы добавить диск данных на виртуальную машину размером 2 ГБ, имеет LUN 0 и тип кэширования ReadWrite, добавьте этот код в блок try в основном методе:

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

Удаление ресурсов

Так как плата взимается за ресурсы, используемые в Azure, всегда рекомендуется удалять ресурсы, которые больше не нужны. Если вы хотите удалить виртуальные машины и все вспомогательные ресурсы, необходимо удалить группу ресурсов.

  1. Чтобы удалить группу ресурсов, добавьте этот код в блок try в основном методе:

    System.out.println("Deleting resources...");
    azure.resourceGroups().deleteByName("myResourceGroup");
    
  2. Сохраните файл App.java.

Запуск приложения

Для полного запуска консольного приложения потребуется около пяти минут.

  1. Чтобы запустить приложение, используйте следующую команду Maven:

    mvn compile exec:java
    
  2. Прежде чем нажать клавишу ВВОД, чтобы начать удаление ресурсов, вы можете потратить несколько минут на проверку создания ресурсов в портале Azure. Нажмите на статус развертывания, чтобы увидеть информацию о развертывании.

Дальнейшие действия