Compartilhar via


Tutorial: Modificar um conjunto de dimensionamento de máquinas virtuais Linux usando a CLI do Azure

Em todo o ciclo de vida de seus aplicativos, talvez seja necessário modificar ou atualizar o Conjunto de Dimensionamento de Máquinas Virtuais. Essas atualizações podem incluir como atualizar a configuração do conjunto de escala, ou alterar a configuração do aplicativo. Este artigo descreve como modificar um conjunto de dimensionamento existente usando a CLI do Azure.

Abaixo, declaramos variáveis de ambiente que serão usadas em todo este documento. Um sufixo aleatório é acrescentado a nomes de recursos que precisam ser exclusivos para cada implantação. O REGION está definido como WestUS2.

Configurar grupo de recursos

Antes de continuar, verifique se o grupo de recursos existe. Esta etapa criará o grupo de recursos se ele ainda não existir.

export RANDOM_SUFFIX=$(openssl rand -hex 3)
export MY_RESOURCE_GROUP_NAME="myResourceGroup$RANDOM_SUFFIX"
export REGION="WestUS2"
az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION
{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx",
  "location": "WestUS2",
  "managedBy": null,
  "name": "myResourceGroupxxx",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Criar o conjunto de dimensionamento de máquinas virtuais

Para garantir que os comandos de atualização e consulta seguintes tenham um recurso válido para uso, crie um conjunto de dimensionamento de máquinas virtuais. Nesta etapa, implantamos um conjunto de dimensionamento básico usando uma imagem válida (Ubuntu2204) e definimos a contagem de instâncias como 5 para que as atualizações específicas de instância possam ter como destino uma ID de instância existente.

export SCALE_SET_NAME="myScaleSet$RANDOM_SUFFIX"
az vmss create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --image Ubuntu2204 \
  --upgrade-policy-mode manual \
  --instance-count 5 \
  --admin-username azureuser \
  --generate-ssh-keys
{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
  "location": "WestUS2",
  "name": "myScaleSetxxx",
  "provisioningState": "Succeeded"
}

Atualizar o modelo do conjunto de dimensionamento

Um conjunto de dimensionamento tem um "modelo de conjunto de dimensionamento" que captura o estado desejado do conjunto de dimensionamento como um todo. Para consultar o modelo de um conjunto de dimensionamento, você pode usar az vmss show:

az vmss show --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME

A apresentação exata da saída depende das opções que você fornecer para o comando. O exemplo a seguir mostra a saída de exemplo condensada da CLI do Azure:

{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
  "location": "WestUS2",
  "name": "myScaleSetxxx",
  "orchestrationMode": "Flexible",
  "platformFaultDomainCount": 1,
  "resourceGroup": "myResourceGroupxxx",
  "sku": {
    "capacity": 5,
    "name": "Standard_DS1_v2",
    "tier": "Standard"
  },
  "timeCreated": "2022-11-29T22:16:43.250912+00:00",
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "networkProfile": {
    "networkApiVersion": "2020-11-01",
    "networkInterfaceConfigurations": [
      {
        "deleteOption": "Delete",
        "disableTcpStateTracking": false,
        "dnsSettings": {
          "dnsServers": []
        },
        "enableIpForwarding": false,
        "ipConfigurations": [
          {
            "applicationGatewayBackendAddressPools": [],
            "applicationSecurityGroups": [],
            "loadBalancerBackendAddressPools": [
              {
                "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/loadBalancers/myScaleSetLB/backendAddressPools/myScaleSetLBBEPool",
                "resourceGroup": "myResourceGroupxxx"
              }
            ],
            "name": "mysca2215IPConfig",
            "privateIpAddressVersion": "IPv4",
            "subnet": {
              "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myScaleSetVNET/subnets/myScaleSetSubnet",
              "resourceGroup": "myResourceGroupxxx"
            }
          }
        ],
        "name": "mysca2215Nic",
        "networkSecurityGroup": {
          "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/networkSecurityGroups/myScaleSetNSG",
          "resourceGroup": "myResourceGroupxxx"
        },
        "primary": true
      }
    ]
  },
  "osProfile": {
    "allowExtensionOperations": true,
    "computerNamePrefix": "myScaleS",
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "enableVmAgentPlatformUpdates": false,
      "patchSettings": {
        "assessmentMode": "ImageDefault",
        "patchMode": "ImageDefault"
      },
      "provisionVmAgent": true
    }
  },
  "storageProfile": {
    "imageReference": {
      "offer": "UbuntuServer",
      "publisher": "Canonical",
      "sku": "22_04-lts",
      "version": "latest"
    },
    "osDisk": {
      "caching": "ReadWrite",
      "createOption": "FromImage",
      "deleteOption": "Delete",
      "diskSizeGb": 30,
      "managedDisk": {
        "storageAccountType": "Premium_LRS"
      },
      "osType": "Linux"
    }
  }
}

Você pode usar az vmss update para atualizar várias propriedades do conjunto de dimensionamento. Por exemplo, atualizando o tipo de licença ou a política de proteção de instância de uma VM. Observe que o valor de tipo de licença permitido é RHEL_BYOS em vez de Windows_Server.

az vmss update --name $SCALE_SET_NAME --resource-group $MY_RESOURCE_GROUP_NAME --license-type RHEL_BYOS
export INSTANCE_ID=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].instanceId" \
  -o tsv)

az vmss update \
  --name $SCALE_SET_NAME \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --instance-id "$INSTANCE_ID" \
  --protect-from-scale-set-actions False \
  --protect-from-scale-in

Adicionalmente, se você tiver implantado anteriormente o conjunto de dimensionamento com o comando az vmss create, você pode executar o comando az vmss create novamente para atualizar o conjunto de dimensionamento. Certifique-se de que todas as propriedades do comando az vmss create sejam as mesmas de antes, exceto as propriedades que você quer modificar. Por exemplo, abaixo, estamos aumentando a contagem de instâncias para cinco.

Importante

A partir de novembro de 2023, os conjuntos de dimensionamento de VM criados usando o PowerShell e a CLI do Azure serão padrão para o Modo de Orquestração Flexível se nenhum modo de orquestração for especificado. Para obter mais informações sobre essa alteração e quais ações você deve executar, acesse Alteração Interruptiva para Clientes PowerShell/CLI de VMSS – Hub de Comunidade da Microsoft

az vmss create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --orchestration-mode flexible \
  --image RHELRaw8LVMGen2 \
  --admin-username azureuser \
  --generate-ssh-keys \
  --instance-count 5 \
  --os-disk-size-gb 64

Atualizar instâncias de VM individuais em um conjunto de dimensionamento

Semelhante a como um conjunto de dimensionamento tem uma exibição de modelo, cada instância de VM no conjunto de dimensionamento tem sua própria exibição de modelo. Para consultar a exibição do modelo para uma determinada instância de máquina virtual em um conjunto de dimensionamento, você pode usar az vm show.

export INSTANCE_NAME=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].name" \
  -o tsv)

az vm show --resource-group $MY_RESOURCE_GROUP_NAME --name $INSTANCE_NAME

A apresentação exata da saída depende das opções que você fornecer para o comando. O exemplo a seguir mostra a saída de exemplo condensada da CLI do Azure:

{
  "hardwareProfile": {
    "vmSize": "Standard_DS1_v2"
  },
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachines/myScaleSet_Instance1",
  "location": "WestUS2",
  "name": "myScaleSet_Instance1",
  "networkProfile": {
    "networkInterfaces": [
      {
        "deleteOption": "Delete",
        "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/networkInterfaces/mysca2215Nic-5cf164f7",
        "primary": true,
        "resourceGroup": "myResourceGroupxxx"
      }
    ]
  },
  "osProfile": {
    "allowExtensionOperations": true,
    "computerName": "myScaleset_Computer1",
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "enableVmAgentPlatformUpdates": false,
      "patchSettings": {
        "assessmentMode": "ImageDefault",
        "patchMode": "ImageDefault"
      },
      "provisionVmAgent": true
    }
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "myResourceGroupxxx",
  "storageProfile": {
    "dataDisks": [],
    "imageReference": {
      "exactVersion": "22.04.202204200",
      "offer": "0001-com-ubuntu-server-jammy",
      "publisher": "Canonical",
      "sku": "22_04-lts",
      "version": "latest"
    },
    "osDisk": {
      "caching": "ReadWrite",
      "createOption": "FromImage",
      "deleteOption": "Delete",
      "diskSizeGb": 30,
      "managedDisk": {
        "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/disks/myScaleSet_Instance1_disk1_xxx",
        "resourceGroup": "myResourceGroupxxx",
        "storageAccountType": "Premium_LRS"
      },
      "name": "myScaleSet_Instance1_disk1_xxx",
      "osType": "Linux"
    }
  },
  "timeCreated": "2022-11-29T22:16:44.500895+00:00",
  "type": "Microsoft.Compute/virtualMachines",
  "virtualMachineScaleSet": {
    "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
    "resourceGroup": "myResourceGroupxxx"
  }
}

Essas propriedades descrevem a configuração de uma instância de VM dentro de um conjunto de escalas, não a configuração do conjunto de escalas como um todo.

Você pode executar atualizações em instâncias de VM individuais em um conjunto de dimensionamento, assim como faria com uma VM autônoma. Por exemplo, anexar um novo disco de dados à instância 1:

az vm disk attach --resource-group $MY_RESOURCE_GROUP_NAME --vm-name $INSTANCE_NAME --name disk_name1 --new

Executando az vm show novamente, agora veremos que a instância da VM tem o novo disco anexado.

{
  "storageProfile": {
    "dataDisks": [
      {
        "caching": "None",
        "createOption": "Empty",
        "deleteOption": "Detach",
        "diskSizeGb": 1023,
        "lun": 0,
        "managedDisk": {
          "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/disks/disk_name1",
          "resourceGroup": "myResourceGroupxxx",
          "storageAccountType": "Premium_LRS"
        },
        "name": "disk_name1",
        "toBeDetached": false
      }
    ]
  }
}

Adicionar uma instância ao conjunto de dimensionamento

Há momentos em que talvez você queira adicionar uma nova VM ao seu conjunto de dimensionamento, mas deseja opções de configuração diferentes daquelas listadas no modelo de conjunto de dimensionamento. As VMs podem ser adicionadas a um conjunto de dimensionamento durante a criação usando o comando az vm create e especificando o nome do conjunto de dimensionamento ao qual você deseja que a instância seja adicionada.

export NEW_INSTANCE_NAME="myNewInstance$RANDOM_SUFFIX"
az vm create --name $NEW_INSTANCE_NAME --resource-group $MY_RESOURCE_GROUP_NAME --vmss $SCALE_SET_NAME --image RHELRaw8LVMGen2
{
  "fqdns": "",
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachines/myNewInstancexxx",
  "location": "WestUS2",
  "macAddress": "60-45-BD-D7-13-DD",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.6",
  "publicIpAddress": "20.172.144.96",
  "resourceGroup": "myResourceGroupxxx",
  "zones": ""
}

Se verificarmos nosso conjunto de dimensionamento, veremos a nova instância adicionada.

az vm list --resource-group $MY_RESOURCE_GROUP_NAME --output table
Name                  ResourceGroup      Location
--------------------  ---------------    ----------
myNewInstancexxx      myResourceGroupxxx WestUS2
myScaleSet_Instance1  myResourceGroupxxx WestUS2
myScaleSet_Instance1  myResourceGroupxxx WestUS2

Atualizar as VMs com o modelo mais recente do conjunto de dimensionamento

Observação

Atualmente, não há suporte para modos de atualização em Conjuntos de Dimensionamento de Máquinas Virtuais usando o modo de orquestração flexível.

Os conjuntos de dimensionamento têm uma "política de atualização" que determinam como as VMs são atualizadas com o modelo mais recente do conjunto de dimensionamento. Os três modos da política de atualização são:

  • Automático - neste modo, o conjunto de escala não garante a ordem das VMs sendo interrompidas. O conjunto de dimensionamento pode interromper todas as VMs ao mesmo tempo.
  • Distribuição em lotes - neste modo, o conjunto de dimensionamento distribui a atualização em lotes com um tempo de pausa opcional entre os lotes.
  • Manual – neste modo, quando você atualiza o modelo do conjunto de dimensionamento, nada acontecerá nas VMs existentes até que uma atualização manual seja disparada.

Se o conjunto de dimensionamento estiver definido como atualizações manuais, você poderá disparar uma atualização manual usando az vmss update.

az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME

Observação

Clusters do Service Fabric só podem usar o modo Automático, mas a atualização é tratada de maneira diferente. Para saber mais, veja Atualizações de aplicativos do Service Fabric.

Refazer a imagem de um conjunto de dimensionamento

Os Conjuntos de Dimensionamento de Máquinas Virtuais irão gerar um nome exclusivo para cada VM no conjunto de dimensionamento. A convenção de nomenclatura difere pelo modo de orquestração:

  • Modo de orquestração flexível: {scale-set-name}_{8-char-guid}
  • Modo de orquestração uniforme: {scale-set-name}_{instance-id}

Nos casos em que você precisa refazer a imagem de uma instância específica, use az vmss reimage e especifique a ID da instância. Outra opção é usar az vm redeploy para refazer a imagem da VM diretamente. Esse comando será útil se você quiser refazer a imagem de uma VM sem precisar especificar a ID da instância.

# Get the VM name first
VM_NAME=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].name" \
  -o tsv)

# Reimage the VM directly
az vm redeploy \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $VM_NAME

Atualizar a imagem do SO para seu conjunto de dimensionamento

Você pode ter um conjunto de escalas que executa uma versão antiga do Ubuntu. Você deseja atualizar para uma versão mais recente do Ubuntu, como a versão mais recente. A propriedade da versão de referência da imagem não é parte de uma lista, logo você pode modificar diretamente essas propriedades usando az vmss update.

az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --set virtualMachineProfile.storageProfile.imageReference.version=latest

Como alternativa, você talvez queira alterar a imagem que seu conjunto de dimensionamento usa. Por exemplo, você talvez queira atualizar ou alterar uma imagem personalizada usada pelo seu conjunto de dimensionamento. Você pode alterar a imagem que seu conjunto de dimensionamento usa atualizando a propriedade da ID de referência da imagem. A propriedade da ID de referência da imagem não é parte de uma lista, logo você pode modificar diretamente essa propriedade usando az vmss update.

Se você estiver usando imagens de plataforma do Azure, poderá atualizar a imagem modificando o imageReference (mais informações na documentação da API REST).

Observação

Com imagens de plataforma, é comum especificar "mais recente" para a versão de referência de imagem. Ao criar, dimensionar e recriar a imagem, as VMs são criadas com a versão disponível mais recente. No entanto, isso não significa que a imagem do SO será atualizada automaticamente ao longo do tempo com o lançamento de novas versões da imagem. Um recurso separado fornece atualizações automáticas do SO. Para obter mais informações, confira a Documentação de Atualização Automática do SO.

Se você usar imagens personalizadas, poderá atualizar a imagem atualizando a ID do imageReference (mais informações na documentação da API REST).

Atualizar o balanceador de carga para o conjunto de dimensionamento

Digamos que você tenha um conjunto de dimensionamento com um Azure Load Balancer e você queira substituir o Azure Load Balancer por um Gateway de Aplicativo do Azure. As propriedades do balanceador de carga e do Gateway de Aplicativo do Azure referentes a um conjunto de dimensionamento são parte de uma lista, logo você pode usar os comandos para remover e adicionar elementos da lista em vez de modificar as propriedades diretamente.

# Remove the load balancer backend pool from the scale set model
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerBackendAddressPools 0

# Remove the load balancer backend pool from the scale set model; only necessary if you have NAT pools configured on the scale set
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerInboundNatPools 0

# Add the application gateway backend pool to the scale set model
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --add virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].ApplicationGatewayBackendAddressPools '{"id": "/subscriptions/xxxxx/resourceGroups/'$MY_RESOURCE_GROUP_NAME'/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendPoolName}"}'

Observação

Esses comandos pressupõem que há apenas um balanceador de carga e uma configuração de IP no conjunto de dimensionamento. Se houver vários, você precisará usar um índice de lista diferente de 0.

Próximas etapas

Neste tutorial, você aprendeu a modificar vários aspectos do conjunto de dimensionamento e das instâncias individuais.

  • Atualizar o modelo do conjunto de dimensionamento
  • Atualizar uma instância de VM individual em um conjunto de dimensionamento
  • Adicionar uma instância ao conjunto de dimensionamento
  • Atualizar as VMs com o modelo mais recente do conjunto de dimensionamento
  • Refazer a imagem de um conjunto de dimensionamento
  • Atualizar a imagem do SO para seu conjunto de dimensionamento
  • Atualizar o balanceador de carga para o conjunto de dimensionamento