Compartilhar via


Visão geral de aplicativos de VM

Aplicativos de VM são um tipo de recurso na Galeria de Computação do Azure que fornece uma abordagem moderna e flexível para gerenciar e implantar aplicativos em suas máquinas virtuais e conjuntos de dimensionamento. Ao desacoplar a instalação do aplicativo de suas imagens de VM base, você pode simplificar as atualizações, reduzir a sobrecarga de manutenção de imagem e acelerar os ciclos de implantação. Essa abordagem elimina a necessidade de recriar e republicar imagens de VM para cada alteração de aplicativo, permitindo iteração mais rápida e maior agilidade operacional. Os aplicativos de VM são mais adequados para implantar ia, alta escala, baixa latência, microsserviços, cargas de trabalho seguras e compatíveis em VMs do Azure.

Recurso Descrição
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 deve ser exclusivo por assinatura. Por exemplo, você pode ter uma galeria para armazenar todas as imagens do sistema operacional e outra galeria para armazenar todos os seus aplicativos de VM.
Aplicativo VM A definição do aplicativo de VM. É um recurso lógico que armazena os metadados comuns para todas as versões abaixo dele. Por exemplo, você pode ter uma definição de aplicativo para Apache Tomcat e ter várias versões dentro dela.
Versão do Aplicativo de VM O recurso implantável, que contém o pacote de aplicativos e as configurações específicas da versão. 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 ser implantada em uma VM nessa região.
Conta de armazenamento Os pacotes de aplicativos são carregados pela primeira vez em sua conta de armazenamento. Em seguida, a Galeria de Computação do Azure baixa o pacote de aplicativos dessa conta de armazenamento usando URLs SAS e o armazena na versão do Aplicativo de VM. A Galeria de Computação do Azure também replica esse pacote entre regiões e réplicas regionais de acordo com a definição de versão do aplicativo de VM. O pacote de aplicativos na conta de armazenamento pode ser excluído após a criação da versão do aplicativo VM na Galeria de Computação do Azure.

Diagrama mostrando etapas para criar um aplicativo de VM e implantá-lo no Azure

Principais benefícios:

  • Gerenciamento centralizado e flexível de aplicativos:
    • Empacotar qualquer coisa uma vez, implantar em qualquer lugar: empacotar aplicativos (windows/linux), scripts ou arquivos como aplicativos de VM. Em seguida, implante-o em VMs do Azure ou conjuntos de dimensionamento de máquinas virtuais e gerencie-os centralmente na Galeria de Computação do Azure. Aplicativos ou arquivos podem estar em .zip, .msi, .exe, .tar.gz, .deb, .rpm, .sh ou qualquer outro formato.
    • Controle de versão: implante a versão mais recente ou específica mantendo várias versões de cada aplicativo.
  • Compartilhamento contínuo e controle de acesso
    • Tenant-Wide Compartilhamento: compartilhar aplicativos em equipes ou em toda a sua organização (locatário).
    • RBAC integrado: controlar o acesso à publicação e implantação usando o RBAC (Controle de Acesso Role-Based) do Azure.
  • Implantações confiáveis e personalizáveis
    • Controle de Aplicativo Individual: instalar, atualizar ou excluir aplicativos de forma independente, sem necessidade de recriar imagens de VM.
    • Operações personalizáveis: personalize operações de instalação, atualização e exclusão para aplicativos, incluindo tratamento de reinicialização.
    • Built-In Tratamento de Falhas: garanta implantações resilientes conectando falha do aplicativo VM à falha da VM.
  • Distribuição escalonável e Low-Latency
    • Replicação global e Intra-Region: replique automaticamente aplicativos entre regiões e regiões para reduzir a latência e melhorar a resiliência, sem necessidade de AzCopy ou transferências manuais.
    • Otimizado para cenários de High-Scale: obter baixa latência de criação mesmo durante implantações em grande escala.
  • Seguro e compatível por design
    • Imposição orientada por políticas: use o Azure Policy para impor a presença e a configuração do aplicativo em toda a sua frota.
    • Implantações seguras: evite downloads baseados na Internet e configurações complexas de link privado, que não são ideais para ambientes bloqueados ou seguros.
  • Suporte amplo à plataforma
    • VMs e Conjuntos de Dimensionamento: implantar em VMs individuais, conjuntos de dimensionamento flexíveis ou conjuntos de dimensionamento uniformes com suporte total.
    • Suporte ao Blob de Blocos: manipule com eficiência pacotes de aplicativos grandes (até 2 GB) usando Blobs de Blocos do Azure para uploads em partes e streaming em segundo plano.

Criar recurso de versão de Aplicativos de VM > VM

O aplicativo de VM é armazenado na Galeria de Computação do Azure. O recurso de aplicativo de VM define o seguinte sobre seu aplicativo de VM:

Propriedade Descrição Limitações
nome Nome do aplicativo Comprimento máximo de 117 caracteres. Os caracteres permitidos são letras maiúsculas ou minúsculas, dígitos, hifen(-), ponto (.), sublinhado (_). Nomes não permitidos para terminar com period(.).
supportedOSType Definir o tipo de sistema operacional com suporte "Linux" ou "Windows"
endOfLifeDate Uma data de fim de vida futura para o aplicativo. A data é somente para referência e não é imposta.
descrição Optional. Uma descrição da aplicação VM
Eula Optional. Referência ao EULA (Contrato de Licença de Usuário Final)
privacyStatementUri Optional. Referência à política de privacidade do aplicativo.
releaseNoteUri Optional. Referência às notas de versão do aplicativo.

As versões do aplicativo VM são os recursos implantáveis dentro do recurso aplicativo de VM. As versões são definidas com as seguintes propriedades:

Propriedade Descrição Limitações
local Local de origem para a versão do aplicativo de VM. Região válida do Azure
source/mediaLink Link para o arquivo de pacote de aplicativos em uma conta de armazenamento URL de armazenamento válida e existente
source/defaultConfigurationLink Optional. Um link para o arquivo de configuração do aplicativo de VM. Ele pode ser substituído no momento da implantação. URL de armazenamento válida e existente
manageActions/install Instalar o script como cadeia de caracteres para instalar corretamente o aplicativo Comando válido para o sistema operacional especificado no formato de cadeia de caracteres.
manageActions/remove Remover o script como cadeia de caracteres para remover corretamente o aplicativo Comando válido para o sistema operacional especificado no formato de cadeia de caracteres
manageActions/update Optional. Atualize o script como cadeia de caracteres para atualizar corretamente o aplicativo de VM para uma versão mais recente. Comando válido para o sistema operacional especificado no formato de cadeia de caracteres
targetRegions/name Nome das regiões de destino para as quais replicar. Melhora a resiliência à falha de região e cria latência. Região válida do Azure
targetRegions/regionalReplicaCount Optional. O número de réplicas a serem criadas na região. Melhora o tratamento de carga e cria latência. O padrão é 1. Inteiro entre 1 e 3 inclusive
replicaCount Optional. Define o número de réplicas em cada região. Entrará em vigor se regionalReplicaCount não estiver definido. Melhora a resiliência à região ou à falha do cluster e cria latência durante a alta escala. Inteiro entre 1 e 3 inclusive.
endOfLifeDate Optional. Uma data de fim de vida futura para a versão do aplicativo. Essa propriedade é somente para referência do cliente e não é imposta. Data futura válida
excludeFromLatest Exclua a versão de ser usada como a versão mais recente do aplicativo quando a palavra-chave 'latest' for usada no applicationProfile.
storageAccountType Optional. Tipo de conta de armazenamento a ser usada em cada região para armazenar o pacote de aplicativos. O padrão é Standard_LRS. Essa propriedade não é atualizável.
safetyProfile/allowDeletionOfReplicatedLocations Optional. Indica se a remoção ou não dessa Versão da Imagem da Galeria de regiões replicadas é permitida.
settings/packageFileName Nome do arquivo de pacote a ser usado quando o pacote é baixado para a VM. Isso é limitado a 4.096 caracteres.
settings/configFileName Nome do arquivo de configuração a ser usado quando a configuração é baixada para a VM. Isso é limitado a 4.096 caracteres.
settings/scriptBehaviorAfterReboot Optional. A ação a ser tomada para instalar, atualizar ou remover o aplicativo da galeria após a reinicialização da VM.

{
  "$schema": "https://schema.management.azure.com/schemas/2020-06-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "galleryName": {
      "type": "string"
    },
    "applicationName": {
      "type": "string"
    },
    "versionName": {
      "type": "string",
      "metadata": {
        "description": "Must follow the format: major.minor.patch (Example: 1.0.0)"
      }
    },
    "___location": {
      "type": "string",
      "defaultValue": "West US"
    },
    "supportedOSType": {
      "type": "string",
      "allowedValues": ["Windows", "Linux"]
    },
    "endOfLifeDate": {
      "type": "string",
      "metadata": {
        "description": "Optional. This property is for information only and doesn't block app deployment."
      }
    },
    "description": {
      "type": "string",
      "defaultValue": "Description of the application"
    },
    "eula": {
      "type": "string",
      "defaultValue": ""
    },
    "privacyStatementUri": {
      "type": "string",
      "defaultValue": ""
    },
    "releaseNoteUri": {
      "type": "string",
      "defaultValue": ""
    },
    "mediaLink": {
      "type": "string"
    },
    "configLink": {
      "type": "string"
    },
    "appConfigFileName": {
      "type": "string"
    },
    "appPackageFileName": {
      "type": "string"
    },
    "replicaRegion1": {
      "type": "string",
      "defaultValue": "East US"
    },
    "replicaRegion2": {
      "type": "string",
      "defaultValue": "South Central US"
    },
    "installScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to install the application. Example: echo 'Installing application...'"
      }
    },
    "updateScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to update the application. Example: echo 'Updating application...'"
      }
    },
    "removeScript": {
      "type": "string",
      "metadata": {
        "description": "Optional. Script to run to delete the application. Example: echo 'Deleting application...'"
      }
    },
    "storageAccountType": {
      "type": "string",
      "allowedValues": ["PremiumV2_LRS", "Premium_LRS", "Standard_LRS", "Standard_ZRS"],
      "defaultValue": "Standard_LRS"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Compute/galleries",
      "apiVersion": "2024-03-03",
      "name": "[parameters('galleryName')]",
      "___location": "[parameters('___location')]",
      "properties": {
        "identifier": {}
      }
    },
    {
      "type": "Microsoft.Compute/galleries/applications",
      "apiVersion": "2024-03-03",
      "name": "[format('{0}/{1}', parameters('galleryName'), parameters('applicationName'))]",
      "___location": "[parameters('___location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Compute/galleries', parameters('galleryName'))]"
      ],
      "properties": {
        "supportedOSType": "[parameters('supportedOSType')]",
        "endOfLifeDate": "[parameters('endOfLifeDate')]",
        "description": "[parameters('description')]",
        "eula": "[if(equals(parameters('eula'), ''), json('null'), parameters('eula'))]",
        "privacyStatementUri": "[if(equals(parameters('privacyStatementUri'), ''), json('null'), parameters('privacyStatementUri'))]",
        "releaseNoteUri": "[if(equals(parameters('releaseNoteUri'), ''), json('null'), parameters('releaseNoteUri'))]"
      }
    },
    {
      "type": "Microsoft.Compute/galleries/applications/versions",
      "apiVersion": "2024-03-03",
      "name": "[format('{0}/{1}/{2}', parameters('galleryName'), parameters('applicationName'), parameters('versionName'))]",
      "___location": "[parameters('___location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Compute/galleries/applications', parameters('galleryName'), parameters('applicationName'))]"
      ],
      "properties": {
        "publishingProfile": {
          "source": {
            "mediaLink": "[parameters('mediaLink')]",
            "defaultConfigurationLink": "[parameters('configLink')]"
          },
          "manageActions": {
            "install": "[parameters('installScript')]",
            "remove": "[parameters('removeScript')]",
            "update": "[parameters('updateScript')]"
          },
          "settings": {
            "scriptBehaviorAfterReboot": "Rerun",
            "configFileName": "[parameters('appConfigFileName')]",
            "packageFileName": "[parameters('appPackageFileName')]"
          },
          "targetRegions": [
            {
              "name": "[parameters('___location')]",
              "regionalReplicaCount": 3,
              "storageAccountType": "[parameters('storageAccountType')]"
            },
            {
              "name": "[parameters('replicaRegion1')]",
              "regionalReplicaCount": 1,
              "storageAccountType": "[parameters('storageAccountType')]"
            },
            {
              "name": "[parameters('replicaRegion2')]"
            },
          ],
          "excludeFromLatest": false,
          "replicaCount": 2,
          "storageAccountType": "[parameters('storageAccountType')]"
        },
        "safetyProfile": {
          "allowDeletionOfReplicatedLocations": true
        },
        "endOfLifeDate": "[parameters('endOfLifeDate')]"
      }
    }
  ]
}

Implantar aplicativos de VM do Azure

Depois que a versão do aplicativo VM for publicada na Galeria de Computação do Azure, você poderá implantar a versão em VMs (Máquinas Virtuais) do Azure e conjuntos de dimensionamento de máquinas virtuais do Azure.

Os applicationProfile conjuntos de dimensionamento de máquinas virtuais e VM do Azure definem o seguinte:

Propriedade Descrição Limitações
galleryApplications Aplicativos da Galeria a serem implantados
ID de referência do pacote Referência à versão do aplicativo a ser implantada Referência de versão válida do aplicativo
referência de configuração Optional. A URL completa de um blob de armazenamento que contém a configuração dessa implantação. Isso substitui qualquer valor fornecido para defaultConfiguration anteriormente. Referência de blob de armazenamento válida
ordem Optional. Ordem na qual implantar aplicativos Inteiro válido
treatFailureAsDeploymentFailure Optional. Marcar falha de aplicativo como falha de implantação de VM para tratamento de falhas Verdadeiro ou Falso

O campo de ordem pode ser usado para especificar dependências entre aplicativos. As regras de ordem são as seguintes:

Caso Instalar significado Significado da falha
Nenhuma ordem especificada Aplicativos não ordenados são instalados após aplicativos ordenados. Não há garantia de ordem de instalação entre os aplicativos não ordenados. Falhas de instalação de outros aplicativos, sejam eles ordenados ou não ordenados, não afetam a instalação de aplicativos não ordenados.
Valores de pedido duplicados O aplicativo é instalado em qualquer ordem em comparação com outros aplicativos com a mesma ordem. Todos os aplicativos da mesma ordem são instalados após os com pedidos mais baixos e antes daqueles com pedidos mais altos. Se um aplicativo anterior com uma ordem inferior não tiver sido instalado, nenhum aplicativo com essa ordem será instalado. Se algum aplicativo com essa ordem não for instalado, nenhum aplicativo com uma instalação de ordem superior.
Aumentando os pedidos O aplicativo será instalado após os pedidos mais baixos e antes dos pedidos mais altos. Se um aplicativo anterior com uma ordem inferior não tiver sido instalado, esse aplicativo não será instalado. Se esse aplicativo não for instalado, nenhum aplicativo com uma ordem superior será instalado.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmssName": {
      "type": "string"
    },
    "___location": {
      "type": "string"
    },
    "subscriptionId": {
      "type": "string"
    },
    "resourceGroupName": {
      "type": "string"
    },
    "galleryName": {
      "type": "string"
    },
    "applicationName1": {
      "type": "string"
    },
    "applicationVersion1": {
      "type": "string",
      "defaultValue": "latest"
    },
    "configurationReference1": {
      "type": "string",
      "metadata": {
        "description": "Optional path to configuration file from Storage Account. Overrides default configuration file."
      }
    },
    "applicationName2": {
      "type": "string"
    },
    "applicationVersion2": {
      "type": "string",
      "defaultValue": "latest"
    }
  },
  "variables": {
    "packageReferenceId1": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/galleries/{2}/applications/{3}/versions/{4}', parameters('subscriptionId'), parameters('resourceGroupName'), parameters('galleryName'), parameters('applicationName1'), parameters('applicationVersion1'))]",
    "packageReferenceId2": "[format('/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/galleries/{2}/applications/{3}/versions/{4}', parameters('subscriptionId'), parameters('resourceGroupName'), parameters('galleryName'), parameters('applicationName2'), parameters('applicationVersion2'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachineScaleSets",
      "apiVersion": "2024-03-03",
      "name": "[parameters('vmssName')]",
      "___location": "[parameters('___location')]",
      "properties": {
        "virtualMachineProfile": {
          "applicationProfile": {
            "galleryApplications": [
              {
                "order": 1,
                "packageReferenceId": "[variables('packageReferenceId1')]",
                "configurationReference": "[parameters('configurationReference1')]",
                "treatFailureAsDeploymentFailure": true
              },
              {
                "order": 2,
                "packageReferenceId": "[variables('packageReferenceId2')]",
                "treatFailureAsDeploymentFailure": false
              }
            ]
          }
        }
      }
    }
  ]
}

Custo

Não há nenhum custo adicional para usar pacotes de aplicativos de VM, mas você é cobrado pelos seguintes recursos:

  • Armazenamento custos de armazenamento de cada pacote e todas as réplicas.
  • Encargos de saída de rede para replicação da primeira versão de 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á encargos adicionais.

Para saber mais sobre saída de rede, confira Preços de largura de banda.

Detalhes técnicos

Considerações e limites atuais

  • Até 10 réplicas por região: quando você está criando uma versão do aplicativo VM, o número máximo de réplicas por região é 10 para blob de páginas e blob de blocos.

  • Até 300 versões por região: ao criar uma versão do aplicativo VM, você pode ter até 300 versões de aplicativo por região.

  • Armazenamento com acesso público e URI SAS com privilégio de leitura: A conta de armazenamento precisa ter acesso em nível público e usar um URI sas com privilégio de leitura, pois outros níveis de restrição falham nas implantações. Os Tokens SAS podem ser contornados ao publicar o artefato na conta de armazenamento, permitindo acesso anônimo.

  • Repetição manual para instalações com falha: atualmente, a única maneira de tentar novamente uma instalação com falha é remover o aplicativo do perfil e adicioná-lo novamente.

  • Até 25 aplicativos por VM: no máximo 25 aplicativos podem ser implantados em uma única máquina virtual.

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

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

  • Versão única do aplicativo por VM: apenas uma versão de um determinado aplicativo pode ser implantada em uma VM.

  • Atualmente, não há suporte para operações de movimentação: atualmente, não há suporte para mover VMs com aplicativos de VM associados entre grupos de recursos.

Observação

No caso da Galeria de Computação e aplicativos de VM do Azure, a SAS de Armazenamento pode ser excluída após a replicação. No entanto, qualquer operação de atualização subsequente requer uma SAS válida.

Baixar o diretório dentro da VM

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

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

Os comandos install/update/remove devem ser gravados supondo que o pacote de aplicativos e o arquivo de configuração estão no diretório atual.

Nome do arquivo

Quando o arquivo de aplicativo é baixado para a VM, o arquivo é renomeado como "MyVmApp" e não tem nenhuma extensão de arquivo (por exemplo, .exe, .msi). A VM não está ciente do nome e da extensão originais do arquivo.

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

Você pode modificar o 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 packageFileName (e seu configFileName correspondente) para nos instruir sobre como renomear seu arquivo. Por exemplo, defini-lo como "MyApp.exe" torna o script de instalação da seguinte maneira.

MyAppe.exe /S

Dica

Se o blob for originalmente nomeado como 'myApp.exe' em vez de 'myapp', o script funcionará sem definir a packageFileName propriedade.

Interpretador de comando

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 ele seja instalado no computador, chamando o executável e passando o comando para ele. Por exemplo, para que o comando seja executado no PowerShell Windows em vez de cmd, você pode passarpowershell.exe -Command '<powershell commmand>'

Como as atualizações são controladas

Ao atualizar uma versão do aplicativo em uma VM ou em Conjuntos de Dimensionamento de Máquinas Virtuais, o comando de atualização fornecido durante a implantação será usado. Se a versão atualizada não tiver um comando de atualização, a versão atual será removida e a nova versão será instalada.

Os comandos de atualização devem ser gravados com a expectativa de que ele possa estar atualizando de qualquer versão mais antiga do Aplicativo de VM.

Tratar a falha como uma falha de implantação

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

Empacotar e instalar aplicativos de VM no Linux

Para criar um aplicativo de VM, você precisa de um pacote de aplicativos e scripts para instalar, atualizar e excluir corretamente o aplicativo.
Aplicativos de terceiros para Linux podem ser empacotados de algumas maneiras. Vamos explorar como lidar com a criação de comandos de instalação para alguns dos mais comuns.

Arquivos .tar e .gz

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

Exemplo para instalar o comando para instalar golang o em um computador Linux:

sudo tar -C /usr/local -xzf go_linux

Exemplo de comando de remoção:

sudo rm -rf /usr/local/go

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

É possível 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 de aplicativos ou fazer com que o Gerenciador de pacotes do sistema Baixe as dependências por meio dos repositórios que estão disponíveis para a VM. Se você estiver trabalhando com uma VM com acesso restrito à Internet, você deve empacotar todas as dependências por conta própria.

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

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

Para criar um pacote de aplicativo de VM para instalar o PowerShell no Ubuntu, execute as seguintes etapas:

  1. Execute os comandos a seguir para habilitar o repositório para baixar o PowerShell e identificar dependências de 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, lib32gcc-s1, 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 tar compactado com todos os arquivos.
  • Ubuntu 18.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
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 lib32gcc-s1
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 lib32gcc-s1
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 será o arquivo do pacote de aplicativos.
  • 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 remover explicitamente todas as dependências. Você pode ter instalado outros aplicativos com dependências sobrepostas e, nesse caso, um comando de remoção explícito falharia.

Caso você não queira resolver as dependências por conta própria, e apt for capaz de se conectar aos repositórios, você pode instalar um aplicativo com apenas um arquivo .deb e permitir que apt manipule as dependências.

Exemplo de comando de instalação:

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

Criando aplicativos de VM no Windows

A maioria dos aplicativos de terceiros no Windows está disponível como instaladores .exe ou .msi. Alguns também estão disponíveis como extrair e executar arquivos zip. Vamos examinar as práticas recomendadas para cada uma delas.

.exe instalador

Os executáveis do instalador normalmente iniciam uma interface do usuário e exigem que alguém selecione por meio da IU. Se o instalador oferecer suporte a um parâmetro de modo silencioso, ele deverá ser incluído na sua cadeia de caracteres de instalação.

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

Se eu quiser criar um pacote de aplicativo de VM para myApp.exe, que é fornecido como um executável, meu aplicativo de VM é chamado de 'myApp', portanto, eu gravo o comando supondo que o pacote do aplicativo esteja no diretório atual:

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

Se o arquivo executável do instalador não oferecer suporte a um parâmetro de desinstalação, às vezes, você pode procurar o registro em um computador de teste para saber onde o desinstalador está localizado.

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

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

.msi instalador

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

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

Exemplo de comando de remoção:

start /wait %windir%\\system32\\msiexec.exe /x myapp /quiet /forcerestart /log myapp_uninstall.log

Normalmente, o comando start seria chamado dentro de um script em lotes. Se usado com o /wait parâmetro, o script de chamada será pausado até que o processo chamado seja encerrado. Após a conclusão, o script do lote verificará a variável errorlevel definida pelo comando start e sairá da seguinte maneira:

start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log
if %errorlevel% neq 0 exit /b %errorlevel%
...

Arquivos compactados

Para arquivos .zip ou outros arquivos compactados, basta descompactar o conteúdo do pacote de aplicativos no 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 de remoção:

rmdir /S /Q C:\\myapp

Solucionar problemas de aplicativos de VM

Para saber se um aplicativo de VM específico foi adicionado com êxito à instância da VM, verifique a mensagem da extensão aplicativo da 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 e recursos de máquina virtual 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 de conjunto de dimensionamento, 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 Descrição
A Versão Atual do Aplicativo da VM {name} foi descontinuada em {date}. Você tentou implantar uma versão de aplicativo de VM que já foi preterida. Tente usar latest em vez de especificar uma versão específica.
A versão atual da aplicação VM {nome} oferece suporte ao sistema operacional OS {OS}, enquanto o sistema operacional atual do Osdisk é {OS}. Você tentou implantar um aplicativo do Linux para Windows instância do ou vice-versa.
O número máximo de aplicativos de VM (max = 5, Current = {Count}) foi excedido. Use menos aplicativos e repita a solicitação. Atualmente, damos suporte apenas a cinco aplicativos de VM por VM ou conjunto de dimensionamento.
Mais de um aplicativo de VM foi especificado com o mesmo packageReferenceId. O mesmo aplicativo foi especificado mais de uma vez.
Assinatura não autorizada a acessar esta imagem. A assinatura não tem acesso a esta versão do aplicativo.
A conta de armazenamento nos argumentos não existe. Não há aplicativos para esta assinatura.
A imagem de plataforma {image} não está disponível. Verifique se todos os campos no perfil de armazenamento estão corretos. Para obter mais informações sobre o 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}. Contate o proprietário da imagem para replicar nessa região ou altere a região solicitada. A versão do aplicativo da galeria existe, mas não foi replicada para essa região.
A SAS não é válida para o URI de origem {uri}. Foi recebido um erro Forbidden 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 URL da versão do aplicativo da galeria {url} não pode ser acessada devido ao seguinte erro: nome remoto não encontrado. Verifique se o blob existe e se ele está acessível publicamente ou se é uma URL SAS com privilégios de leitura. O caso mais provável é que um URI de SAS com privilégios de leitura não foi fornecido.
A URL da versão do aplicativo da Galeria {URL} não pode ser acessada devido ao seguinte erro: {error description}. Verifique se o blob existe e se ele está acessível publicamente ou se é uma 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 ela está marcada para exclusão. Você só pode repetir a operação de exclusão (ou aguardar a conclusão de uma em andamento). Tentativa de 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 1 e 3 (ambos incluídos). Somente entre 1 e 3 réplicas são permitidas para versões do aplicativo de VM.
A alteração da propriedade "galleryApplicationVersion.properties.publishingProfile.manageActions.install" não é permitida. (Ou atualizar, excluir) Não é possível alterar nenhuma das ações de gerenciamento em uma VmApplication existente. Uma nova versão do VmApplication deve ser criada.
A alteração da propriedade "galleryApplicationVersion.properties.publishingProfile.settings.packageFileName" não é permitida. (Ou configFileName) Não é possível alterar nenhuma das configurações, como o nome do arquivo de 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: tamanho = {size}. O tamanho máximo de blob permitido é '1 GB'. O tamanho máximo de um blob referenciado por mediaLink ou defaultConfigurationLink atualmente é de 1 GB.
O blob referenciado pelo URI de origem {URI} está vazio. Um blob vazio foi referenciado.
Não há suporte para o tipo de blob {type} para a operação {operation}. Há suporte apenas para blobs de páginas e blobs de blocos. O VmApplications dá suporte apenas a blobs de páginas e blobs de blocos.
A SAS não é válida para o URI de origem {uri}. O URI de SAS fornecido para mediaLink ou defaultConfigurationLink não é um URI de SAS válido.
Não é possível especificar {region} nas regiões de destino porque a assinatura não tem o recurso necessário {featureName}. Registre sua assinatura com o recurso necessário 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 de imagem da galeria {regions} devem conter o local da versão de imagem {___location}. A lista de regiões para replicação deve conter o local em que a versão do aplicativo está.
Regiões duplicadas não são permitidas nas regiões de publicação de destino. As regiões de publicação podem não ter duplicatas.
Atualmente, os recursos de versão do aplicativo da galeria não são compatíveis com criptografia. Não há suporte para a propriedade de criptografia para regiões de destino para aplicativos de VM
O nome da entidade não corresponde ao nome na URL da solicitação. A versão do aplicativo da galeria especificada na URL de solicitação não corresponde à especificada no corpo da solicitação.
O nome da versão do aplicativo da galeria é inválido. O nome da versão do aplicativo deve seguir Major(int32). Minor(int32). Formato patch(int32), em que int está entre 0 e 2.147.483.647 (ambos inclusos). Por exemplo, 1.0.0, 2018.12.1 etc. A versão do aplicativo da galeria deve seguir o formato especificado.

Próximas etapas