Partilhar via


Tutorial – Como utilizar o cloud-init para personalizar uma máquina virtual do Linux no Azure no primeiro arranque

Aplica-se a: ✔️ Linux VMs ✔️ Conjuntos de escala flexível

Num tutorial anterior, aprendeu a realizar SSH para uma máquina virtual (VM) e instalar manualmente o NGINX. Para criar VMs de forma rápida e consistente, normalmente pretende-se alguma forma de automatização. Uma abordagem comum para personalizar uma VM no primeiro arranque é utilizar o cloud-init. Neste tutorial, ficará a saber como:

  • Criar um ficheiro de configuração do cloud-init
  • Criar uma VM que utiliza um ficheiro cloud-init
  • Ver uma aplicação Node.js em execução depois de a VM ser criada
  • Utilizar o Key Vault para armazenar certificados
  • Automatizar implementações seguras do NGINX com o cloud-init

Se optar por instalar e utilizar a CLI localmente, este tutorial exigirá que execute a versão 2.0.30 ou posterior da CLI do Azure. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

Descrição geral da inicialização de cloud

Cloud-init é uma abordagem amplamente utilizada para personalizar uma VM com Linux quando arranca pela primeira vez. Pode utilizar o cloud-init para instalar pacotes e escrever ficheiros ou para configurar utilizadores e segurança. Como o cloud-init é executado durante o processo de arranque inicial, não existem passos adicionais ou agentes necessários a aplicar à configuração.

O cloud-init também funciona em distribuições. Por exemplo, não utiliza apt-get install nem yum install para instalar um pacote. Em vez disso, pode definir uma lista dos pacotes a instalar. O cloud-init utiliza automaticamente a ferramenta de gestão de pacotes nativa para a distribuição que selecionar.

Estamos a trabalhar com os nossos parceiros para que o cloud-init seja incluído e fique operacional nas imagens que fornecem ao Azure. Para obter informações detalhadas sobre o suporte de inicialização na nuvem para cada distribuição, consulte Suporte de inicialização na nuvem para VMs no Azure.

Criar ficheiro de configuração do cloud-init

Para ver o cloud-init em ação, crie uma VM que instala o NGINX e executa uma aplicação Node.js “Hello World” simples. A seguinte configuração cloud-init instala os pacotes necessários, cria um aplicativo Node.js e, em seguida, inicializa e inicia o aplicativo.

No prompt bash ou no Cloud Shell, crie um arquivo chamado cloud-init.txt e cole a seguinte configuração. Por exemplo, digite sensible-editor cloud-init.txt para criar o arquivo e veja uma lista de editores disponíveis. Certifique-se de que o ficheiro de inicialização da cloud é copiado corretamente, especialmente a primeira linha:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    defer: true
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
    path: /home/azureuser/myapp/index.js
    defer: true
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

Para obter mais informações sobre as opções de configuração do cloud-init, veja exemplos de configuração do cloud-init.

Criar a máquina virtual

Antes de poder criar uma VM, tem de criar um grupo de recursos com az group create. O exemplo a seguir cria um grupo de recursos. Nesses comandos, um sufixo aleatório é anexado ao grupo de recursos e aos nomes de VM para evitar colisões de nomes durante implantações repetidas.

export RANDOM_SUFFIX=$(openssl rand -hex 3)
export RESOURCE_GROUP="myResourceGroupAutomate$RANDOM_SUFFIX"
export REGION="eastus2"
az group create --name $RESOURCE_GROUP --location $REGION

Resultados:

{
  "id": "/subscriptions/xxxxx-xxxxx-xxxxx-xxxxx/resourceGroups/myResourceGroupAutomatexxx",
  "location": "eastus",
  "managedBy": null,
  "name": "myResourceGroupAutomatexxx",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Agora, crie uma VM com az vm create. Utilize o parâmetro --custom-data para passar o ficheiro de configuração de inicialização da cloud. Forneça o caminho completo para a configuração do cloud-init.txt, se tiver guardado o ficheiro fora do diretório de trabalho atual. O exemplo a seguir cria uma VM; observe que o nome da VM também é acrescentado com o sufixo aleatório.

export VM_NAME="myAutomatedVM$RANDOM_SUFFIX"
az vm create \
    --resource-group $RESOURCE_GROUP \
    --name $VM_NAME \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init.txt

Resultados:

{
  "fqdns": "",
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupAutomatexxx/providers/Microsoft.Compute/virtualMachines/myAutomatedVMxxx",
  "location": "eastus",
  "name": "myAutomatedVMxxx",
  "powerState": "VM running",
  "publicIpAddress": "x.x.x.x",
  "resourceGroup": "myResourceGroupAutomatexxx",
  "zones": ""
}

Demora alguns minutos até a VM ser criada, os pacotes serem instalados e a aplicação ser iniciada. Existem tarefas em segundo plano que continuam a ser executadas após a CLI do Azure devolver o utilizador à linha de comandos. Poderão ser necessários mais alguns minutos antes de poder aceder à aplicação. Quando a VM tiver sido criada, tome nota do publicIpAddress apresentado pela CLI do Azure. Este endereço é utilizado para aceder à aplicação Node.js num browser.

Para permitir que o tráfego da Web aceda à VM, abra a porta 80 a partir da Internet com az vm open-port:

az vm open-port --port 80 --resource-group $RESOURCE_GROUP --name $VM_NAME

Resultados:

{
  "endpoints": [
    {
      "name": "80",
      "protocol": "tcp",
      "publicPort": 80,
      "privatePort": 80
    }
  ],
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupAutomatexxx/providers/Microsoft.Compute/virtualMachines/myAutomatedVMxxx",
  "location": "eastus",
  "name": "myAutomatedVMxxx"
}

Testar a aplicação Web

Agora você pode abrir um navegador da Web e inserir o endereço IP público na barra de endereços. Forneça o seu próprio endereço IP público a partir do processo de criação da VM. A aplicação Node.js é apresentada conforme mostrada no exemplo seguinte:

Captura de tela que mostra o site NGINX em execução.

Próximos passos

Neste tutorial, configurou as VMs no primeiro arranque com o cloud-init. Aprendeu a:

  • Criar um ficheiro de configuração do cloud-init
  • Criar uma VM que utiliza um ficheiro cloud-init
  • Ver uma aplicação Node.js em execução depois de a VM ser criada
  • Utilizar o Key Vault para armazenar certificados
  • Automatizar implementações seguras do NGINX com o cloud-init

Avance para o tutorial seguinte para aprender a criar imagens de VM personalizadas.