Descrição geral das Aplicações de VM

Os Aplicativos VM são um tipo de recurso na Galeria de Computação do Azure (anteriormente conhecida como Galeria de Imagens Compartilhadas) que simplifica o gerenciamento, o compartilhamento e a distribuição global de aplicativos para suas máquinas virtuais.

Embora você possa criar uma imagem de uma VM com aplicativos pré-instalados, precisará atualizar sua imagem sempre que tiver alterações no aplicativo. Separar a instalação do aplicativo das imagens da VM significa que não há necessidade de publicar uma nova imagem para cada linha de alteração de código.

Os pacotes de aplicativos oferecem benefícios em relação a outros métodos de implantação e empacotamento:

  • Os Aplicativos VM têm suporte para Políticas do Azure

  • Agrupamento e controle de versão de seus pacotes

  • Os aplicativos de VM podem ser replicados globalmente para estarem mais próximos de sua infraestrutura, portanto, você não precisa usar o AzCopy ou outros mecanismos de cópia de armazenamento para copiar os bits nas regiões do Azure.

  • Partilhar com outros utilizadores através do Controlo de Acesso Baseado em Funções (RBAC) do Azure

  • Suporte para máquinas virtuais e conjuntos de escala flexíveis e uniformes

  • Se você tiver regras NSG (Network Security Group) aplicadas em sua VM ou conjunto de escala, talvez não seja possível baixar os pacotes de um repositório da Internet. E com contas de armazenamento, o download de pacotes em VMs bloqueadas exigiria a configuração de links privados.

  • Suporte para Blobs de Bloco: Este recurso permite o manuseio eficiente de arquivos grandes, dividindo-os em blocos menores e gerenciáveis. Ideal para carregar grandes quantidades de dados, streaming e upload em segundo plano.

O que são pacotes de aplicativos VM?

Os pacotes de aplicativos VM usam vários tipos de recursos:

Recurso Description
Galeria de computação do Azure Uma galeria é um repositório para gerenciar e compartilhar pacotes de aplicativos. Os usuários podem compartilhar o recurso da galeria e todos os recursos filho são compartilhados automaticamente. O nome da galeria tem de ser exclusivo por subscrição. Por exemplo, você pode ter uma galeria para armazenar todas as imagens do sistema operacional e outra galeria para armazenar todos os aplicativos VM.
Aplicativo VM A definição do seu aplicativo VM. É um recurso lógico que armazena os metadados comuns para todas as versões sob ele. Por exemplo, você pode ter uma definição de aplicativo para o Apache Tomcat e ter várias versões dentro dela.
Versão do aplicativo VM O recurso implantável. Você pode replicar globalmente suas versões de aplicativo de VM para regiões de destino mais próximas de sua infraestrutura de VM. A Versão do Aplicativo VM deve ser replicada para uma região antes de poder ser implantada em uma VM nessa região.

Limitações

  • Não mais do que 3 réplicas por região: quando você cria uma versão do Aplicativo VM, o número máximo de réplicas por região é três.

  • Armazenamento com acesso público ou URI SAS com privilégio de leitura: a conta de armazenamento precisa ter acesso em nível público ou usar um URI SAS com privilégio de leitura, pois outros níveis de restrição falham nas implantações.

  • Repetindo instalações com falha: Atualmente, a única maneira de repetir uma instalação com falha é remover o aplicativo do perfil e, em seguida, adicioná-lo novamente.

  • Apenas 25 aplicativos por VM: Não mais do que 25 aplicativos podem ser implantados em uma VM a qualquer momento.

  • Tamanho do aplicativo de 2 GB: o tamanho máximo do arquivo de uma versão do aplicativo é de 2 GB.

  • Sem garantias de reinicializações no script: se o script exigir uma reinicialização, a recomendação é colocar esse aplicativo por último durante a implantação. Enquanto o código tenta lidar com reinicializações, ele pode falhar.

  • Requer um Agente de VM: O agente de VM deve existir na VM e ser capaz de receber estados de meta.

  • Várias versões do mesmo aplicativo na mesma VM: não é possível ter várias versões do mesmo aplicativo em uma VM.

  • Operações de movimentação atualmente não suportadas: não há suporte para mover VMs com aplicativos VM para outros grupos de recursos no momento.

Nota

Para a Galeria de Computação do Azure e Aplicativos VM, o SAS de Armazenamento pode ser excluído após a replicação.

Custo

Não há cobrança extra pelo uso de Pacotes de Aplicativos de VM, mas você será cobrado pelos seguintes recursos:

  • Custos de armazenamento de armazenamento de cada pacote e quaisquer réplicas.
  • A saída de rede cobra pela replicação da primeira versão da imagem da região de origem para as regiões replicadas. As réplicas subsequentes são tratadas dentro da região, portanto, não há cobranças extras.

Para obter mais informações sobre a saída de rede, consulte Preços de largura de banda.

Aplicativos VM

O recurso de aplicativo VM define o seguinte sobre seu aplicativo VM:

  • Galeria de Computação do Azure onde o aplicativo VM está armazenado
  • Nome do pedido
  • Tipo de SO suportado como Linux ou Windows
  • Uma descrição do aplicativo VM

Versões do aplicativo VM

As versões do aplicativo VM são o recurso implantável. As versões são definidas com as seguintes propriedades:

  • Número de versão
  • Link para o arquivo do pacote do aplicativo em uma conta de armazenamento
  • Cadeia de caracteres de instalação para instalar o aplicativo
  • Remover cadeia de caracteres para mostrar como remover corretamente o aplicativo
  • Nome do arquivo do pacote a ser usado quando ele é baixado para a VM
  • Nome do arquivo de configuração a ser usado para configurar o aplicativo na VM
  • Um link para o arquivo de configuração do aplicativo VM, que você pode incluir arquivos de licença
  • Cadeia de caracteres de atualização para saber como atualizar o aplicativo VM para uma versão mais recente
  • Data de fim de vida. As datas de fim de vida são informativas; você ainda pode implantar versões de aplicativos VM após a data de fim de vida.
  • Excluir do mais recente. Você pode impedir que uma versão seja usada como a versão mais recente do aplicativo.
  • Regiões de destino para replicação
  • Contagem de réplicas por região

Diretório de download

O local de download do pacote do aplicativo e os arquivos de configuração são:

  • Linux: /var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<appname>/<app version>
  • Windows: C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<appname>\<app version>

Os comandos install/update/remove devem ser escritos assumindo que o pacote do aplicativo e o arquivo de configuração estejam no diretório atual.

Nomenclatura de arquivos

Quando o arquivo do aplicativo é baixado para a VM, ele é renomeado como "MyVmApp" (sem extensão). Isso ocorre porque a VM não está ciente do nome original ou da extensão do seu pacote. Ele utiliza o único nome que tem, que é o próprio nome do aplicativo - "MyVmApp".

Aqui estão algumas alternativas para navegar por esse problema:

Você pode modificar seu script para incluir um comando para renomear o arquivo antes da execução:

move .\\MyVmApp .\\MyApp.exe & MyApp.exe /S

Você também pode usar a propriedade (e a packageFileName correspondente configFileName) para nos instruir sobre o que renomear seu arquivo. Por exemplo, defini-lo como "MyApp.exe" fará com que seu script de instalação só precise ser:

MyAppe.exe /S

Gorjeta

Se o seu blob foi originalmente nomeado "myApp.exe" em vez de "myapp", então o script acima teria funcionado sem definir a packageFileName propriedade.

Interpretador de comandos

Os interpretadores de comando padrão são:

  • Linux: /bin/bash
  • Windows: cmd.exe

É possível usar um interpretador diferente, como Chocolatey ou PowerShell, desde que esteja instalado na máquina, chamando o executável e passando o comando para ele. Por exemplo, para que seu comando seja executado no PowerShell no Windows em vez de cmd, você pode passar powershell.exe -Command '<powershell commmand>'

Como as atualizações são tratadas

Quando você atualiza uma versão do aplicativo em uma VM ou Conjuntos de Escala de Máquina Virtual, o comando update fornecido durante a implantação é usado. Se a versão atualizada não tiver um comando update, a versão atual será removida e a nova versão será instalada.

Os comandos de atualização devem ser escritos com a expectativa de que possam ser atualizados a partir de qualquer versão mais antiga do aplicativo VM.

Dicas para criar aplicativos VM no Linux

Aplicativos de terceiros para Linux podem ser empacotados de algumas maneiras. Vamos explorar como lidar com a criação dos comandos de instalação para alguns dos mais comuns.

.tar e .gz arquivos

Esses arquivos são arquivos compactados e podem ser extraídos para um local desejado. Verifique as instruções de instalação do pacote original, caso precisem ser extraídas para um local específico. Se .tar.gz arquivo contiver código-fonte, consulte as instruções para o pacote sobre como instalar a partir do código-fonte.

Exemplo para instalar o comando para instalar golang em uma máquina Linux:

sudo tar -C /usr/local -xzf go_linux

Exemplo de comando remove:

sudo rm -rf /usr/local/go

Criação de pacotes de aplicativos usando .deb, .rpme outros pacotes específicos de plataforma para VMs com acesso restrito à Internet

Você pode baixar pacotes individuais para gerenciadores de pacotes específicos da plataforma, mas eles geralmente não contêm todas as dependências. Para esses arquivos, você também deve incluir todas as dependências no pacote do aplicativo ou fazer com que o gerenciador de pacotes do sistema baixe as dependências por meio dos repositórios disponíveis para a VM. Se você estiver trabalhando com uma VM com acesso restrito à Internet, deverá empacotar todas as dependências por conta própria.

Descobrir as dependências pode ser um pouco complicado. Existem ferramentas de terceiros que podem mostrar toda a árvore de dependência.

No Ubuntu, você pode executar para mostrar todos os pacotes que estão instalados ao executar sudo apt show <package_name> | grep Depends o sudo apt-get install <packge_name> comando. Em seguida, você pode usar essa saída para baixar todos os .deb arquivos para criar um arquivo que pode ser usado como o pacote do aplicativo.

  1. Por exemplo, para criar um pacote de aplicativo VM para instalar o PowerShell para Ubuntu, primeiro execute os seguintes comandos para habilitar o repositório de onde o PowerShell pode ser baixado e também para identificar as dependências do pacote em uma nova VM do Ubuntu.
# Download the Microsoft repository GPG keys
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
sudo rm -rf packages-microsoft-prod.deb
sudo apt update
sudo apt show powershell | grep Depends
  1. Verifique a saída da linha Depende , que lista os seguintes pacotes:
Depends: libc6, libgcc1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl3|libssl1.1|libssl1.0.2|libssl1.
  1. Baixe cada um desses arquivos usando sudo apt-get download <package_name> e crie um arquivo compactado tar com todos os arquivos.
  • Ubuntu 18.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download libgcc1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu60
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 20.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download libgcc1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu66
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  • Ubuntu 22.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download libgcc1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl3
sudo apt-get download libicu70
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
  1. Este arquivo tar é o arquivo do pacote do aplicativo.
  • O comando install neste caso é:
sudo tar -xvzf powershell.tar.gz && sudo dpkg -i *.deb
  • E o comando remove é:
sudo apt remove powershell

Use sudo apt autoremove em vez de tentar explicitamente remover todas as dependências. Você pode ter instalado outros aplicativos com dependências sobrepostas e, nesse caso, um comando remove explícito falharia.

Caso você não queira resolver as dependências sozinho e seja capaz de se conectar aos repositórios, você pode instalar um aplicativo com apenas um .deb arquivo e apt deixar apt lidar com as dependências.

Exemplo de comando de instalação:

dpkg -i <package_name> || apt --fix-broken install -y

Dicas para criar aplicativos VM no Windows

A maioria dos aplicativos de terceiros no Windows estão disponíveis como instaladores .exe ou .msi. Alguns também estão disponíveis como extrair e executar arquivos zip. Vejamos as melhores práticas para cada um deles.

.exe instalador

Os executáveis do instalador normalmente iniciam uma interface do usuário (UI) e exigem que alguém selecione através da interface do usuário. Se o instalador suportar um parâmetro de modo silencioso, ele deve ser incluído na cadeia de caracteres de instalação.

Cmd.exe também espera que os arquivos executáveis tenham a extensão, então você precisa renomear o arquivo para ter a .exe extensão.exe.

Se eu quiser criar um pacote de aplicativo VM para myApp.exe, que é fornecido como um executável, meu aplicativo VM é chamado de 'myApp', então escrevo o comando assumindo que o pacote de aplicativo está no diretório atual:

"move .\\myApp .\\myApp.exe & myApp.exe /S -config myApp_config"

Se o arquivo executável do instalador não suporta um parâmetro de desinstalação, às vezes você pode procurar o registro em uma máquina de teste para saber aqui que o desinstalador está localizado.

No registro, a cadeia de caracteres de desinstalação é armazenada para Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<installed application name>\UninstallString que eu use o conteúdo como meu comando remover:

'\"C:\\Program Files\\myApp\\uninstall\\helper.exe\" /S'

.msi instalador

Para a execução pela linha de comando dos .msi instaladores, os comandos para instalar ou remover um aplicativo devem usar msiexec. Normalmente, é executado como seu próprio processo separado e cmd não espera que ele seja concluído, msiexec o que pode levar a problemas ao instalar mais de um aplicativo VM. O start comando pode ser usado para msiexec garantir que a instalação seja concluída antes que o comando retorne. Por exemplo:

start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log

Exemplo de comando remove:

start /wait %windir%\\system32\\msiexec.exe /x $appname /quiet /forcerestart /log ${appname}_uninstall.log

Arquivos compactados

Para .zip ou outros arquivos compactados, renomeie e descompacte o conteúdo do pacote do aplicativo para o destino desejado.

Exemplo de comando de instalação:

rename myapp myapp.zip && mkdir C:\myapp && powershell.exe -Command "Expand-Archive -path myapp.zip -destinationpath C:\myapp"

Exemplo de comando remove:

rmdir /S /Q C:\\myapp

Tratar falha como falha de implantação

A extensão de aplicativo VM sempre retorna um êxito , independentemente de qualquer aplicativo VM ter falhado ao ser instalado/atualizado/removido. A extensão Aplicativo VM só relata o status da extensão como falha quando há um problema com a extensão ou a infraestrutura subjacente. Esse comportamento é acionado pelo sinalizador "tratar falha como falha de implantação", que é definido como $false padrão e pode ser alterado para $true. O sinalizador de falha pode ser configurado no PowerShell ou na CLI.

Solução de problemas de aplicativos VM

Para saber se um determinado aplicativo VM foi adicionado com êxito à instância VM, verifique a mensagem da extensão Aplicativo VM.

Para saber mais sobre como obter o status das extensões de VM, consulte Extensões e recursos de máquina virtual para Linux e Extensões de máquina virtual e recursos para Windows.

Para obter o status das extensões de VM, use Get-AzVM:

Get-AzVM -name <VM name> -ResourceGroupName <resource group name> -Status | convertto-json -Depth 10

Para obter o status das extensões do conjunto de escala, use Get-AzVMSS:

$result = Get-AzVmssVM -ResourceGroupName $rgName -VMScaleSetName $vmssName -InstanceView
$resultSummary  = New-Object System.Collections.ArrayList
$result | ForEach-Object {
    $res = @{ instanceId = $_.InstanceId; vmappStatus = $_.InstanceView.Extensions | Where-Object {$_.Name -eq "VMAppExtension"}}
    $resultSummary.Add($res) | Out-Null
}
$resultSummary | convertto-json -depth 5

Mensagens de erro

Mensagem Description
Versão atual do aplicativo VM {name} foi preterida em {date}. Você tentou implantar uma versão do aplicativo VM que já foi preterida. Tente usar latest em vez de especificar uma versão específica.
A versão atual do aplicativo VM {name} suporta OS {OS}, enquanto o sistema operacional atual do OSDisk é {OS}. Você tentou implantar um aplicativo Linux na instância do Windows ou vice-versa.
O número máximo de aplicativos VM (max=5, current={count}) foi excedido. Use menos aplicativos e tente novamente a solicitação. Atualmente, suportamos apenas cinco aplicativos VM por VM ou conjunto de escala.
Mais de um aplicativo VM foi especificado com o mesmo packageReferenceId. O mesmo pedido foi especificado mais de uma vez.
Subscrição não autorizada a aceder a esta imagem. A subscrição não tem acesso a esta versão da aplicação.
A conta de armazenamento nos argumentos não existe. Não existem aplicações para esta subscrição.
A imagem da plataforma {image} não está disponível. Verifique se todos os campos no perfil de armazenamento estão corretos. Para obter mais detalhes sobre informações de perfil de armazenamento, consulte https://aka.ms/storageprofile. O aplicativo não existe.
A imagem da galeria {image} não está disponível na região {region}. Entre em contato com o proprietário da imagem para replicar para essa região ou alterar a região solicitada. A versão do aplicativo de galeria existe, mas não foi replicada para essa região.
O SAS não é válido para uri de origem {uri}. Um Forbidden erro foi recebido do armazenamento ao tentar recuperar informações sobre a url (mediaLink ou defaultConfigurationLink).
O blob referenciado pelo uri de origem {uri} não existe. O blob fornecido para as propriedades mediaLink ou defaultConfigurationLink não existe.
A versão do aplicativo galeria url {url} não pode ser acessada devido ao seguinte erro: nome remoto não encontrado. Certifique-se de que o blob existe e que é acessível publicamente ou é um URL SAS com privilégios de leitura. O caso mais provável é que um uri SAS com privilégios de leitura não foi fornecido.
A url da versão do aplicativo galeria {url} não pode ser acessada devido ao seguinte erro: {error description}. Certifique-se de que o blob existe e que é acessível publicamente ou é um URL SAS com privilégios de leitura. Houve um problema com o blob de armazenamento fornecido. A descrição do erro fornece mais informações.
A operação {operationName} não é permitida em {application}, pois está marcada para exclusão. Você só pode tentar novamente a operação Excluir (ou aguardar a conclusão de uma operação em andamento). Tente atualizar um aplicativo que está sendo excluído no momento.
O valor {value} do parâmetro 'galleryApplicationVersion.properties.publishingProfile.replicaCount' está fora do intervalo. O valor deve estar entre um e três, inclusive. Somente entre uma e três réplicas são permitidas para versões de aplicativos VM.
Não é permitido alterar a propriedade 'galleryApplicationVersion.properties.publishingProfile.manageActions.install'. (ou atualizar, excluir) Não é possível alterar nenhuma das ações de gerenciamento em um VmApplication existente. Uma nova versão do VmApplication deve ser criada.
Não é permitido alterar a propriedade ' galleryApplicationVersion.properties.publishingProfile.settings.packageFileName '. (ou configFileName) Não é possível alterar nenhuma das configurações, como o nome do arquivo do pacote ou o nome do arquivo de configuração. Uma nova versão do VmApplication deve ser criada.
O blob referenciado pelo uri de origem {uri} é muito grande: size = {size}. O tamanho máximo de blob permitido é '1 GB'. O tamanho máximo de um blob referido por mediaLink ou defaultConfigurationLink é atualmente de 1 GB.
O blob referenciado pelo uri de origem {uri} está vazio. Um blob vazio foi referenciado.
O tipo de blob {type} não é suportado para a operação {operation}. Apenas blobs de página e blobs de bloco são suportados. VmApplications suporta apenas blobs de página e blobs de bloco.
O SAS não é válido para uri de origem {uri}. O uri SAS fornecido para mediaLink ou defaultConfigurationLink não é um uri SAS válido.
Não é possível especificar {region} nas regiões de destino porque a assinatura está faltando o recurso necessário {featureName}. Registe a sua subscrição com a funcionalidade necessária ou remova a região da lista de regiões de destino. Para usar VmApplications em determinadas regiões restritas, é necessário ter o sinalizador de recurso registrado para essa assinatura.
As regiões do perfil de publicação da versão da imagem da galeria {regions} devem conter o local da versão da imagem {location}. A lista de regiões para replicação deve conter o local onde está a versão do aplicativo.
Regiões duplicadas não são permitidas em regiões de publicação de destino. As regiões de publicação não podem ter duplicatas.
Atualmente, os recursos da versão do aplicativo Gallery não oferecem suporte à criptografia. A propriedade de criptografia para regiões de destino não é suportada para aplicativos VM
O nome da entidade não corresponde ao nome no URL da solicitação. A versão do aplicativo de galeria especificada na URL da solicitação não corresponde à especificada no corpo da solicitação.
O nome da versão do aplicativo de galeria é inválido. O nome da versão do aplicativo deve seguir Major(int32). Menor(int32). Patch(int32), onde int está entre 0 e 2.147.483.647 (inclusive). por exemplo, 1.0.0, 2018.12.1 etc. A versão do aplicativo galeria deve seguir o formato especificado.

Próximos passos