Usar scripts de arranque em VMs do Linux

Um script de arranque é um ficheiro que executa tarefas durante o processo de arranque de uma instância de máquina virtual (VM). Os scripts de arranque podem aplicar-se a todas as VMs num projeto ou a uma única VM. Os scripts de inicialização especificados pelos metadados ao nível da VM substituem os scripts de inicialização especificados pelos metadados ao nível do projeto, e os scripts de inicialização só são executados quando uma rede está disponível. Este documento descreve como usar scripts de arranque em instâncias de VMs Linux. Para obter informações sobre como adicionar um script de arranque ao nível do projeto, consulte o artigo gcloud compute project-info add-metadata.

Para scripts de arranque do Linux, pode usar um ficheiro bash ou não bash. Para usar um ficheiro que não seja bash, designe o intérprete adicionando um #! na parte superior do ficheiro. Por exemplo, para usar um script de arranque do Python 3, adicione #! /usr/bin/python3 na parte superior do ficheiro.

Se especificar um script de arranque através de um dos procedimentos neste documento, o Compute Engine faz o seguinte:

  1. Copia o script de arranque para a VM

  2. Define as autorizações de execução no script de arranque

  3. Executa o script de arranque como o utilizador root quando a VM é iniciada

Para obter informações sobre as várias tarefas relacionadas com scripts de arranque e quando executar cada uma delas, consulte a Vista geral.

Antes de começar

  • Leia a vista geral dos scripts de arranque.
  • Leia acerca do servidor de metadados.
  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Trusted Cloud by S3NS serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Trusted Cloud console to access Trusted Cloud by S3NS services and APIs, you don't need to set up authentication.

    gcloud

    1. Instale a CLI Google Cloud e, em seguida, inicie sessão na CLI gcloud com a sua identidade federada. Depois de iniciar sessão, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init
    2. Set a default region and zone.

    REST

    Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.

      Instale a CLI Google Cloud e, em seguida, inicie sessão na CLI gcloud com a sua identidade federada. Depois de iniciar sessão, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

    Para mais informações, consulte o artigo Autenticar para usar REST na Trusted Cloud documentação de autenticação.

Chaves de metadados para scripts de arranque do Linux

Um script de arranque é transmitido a uma VM a partir de uma localização especificada por uma chave de metadados. Uma chave de metadados especifica se o script de arranque é armazenado localmente, armazenado no Cloud Storage ou transmitido diretamente para a VM. A chave de metadados que usa também pode depender do tamanho do script de arranque.

A tabela seguinte mostra as chaves de metadados que pode usar para scripts de arranque do Linux e fornece informações sobre a chave a usar com base na localização de armazenamento e no tamanho do script de arranque.

Chave de metadados Use para
startup-script Transmitir um script de arranque bash ou não bash armazenado localmente ou adicionado diretamente e com um tamanho máximo de 256 KB
startup-script-url Transmitir um script de arranque bash ou não bash armazenado no Cloud Storage e com um tamanho superior a 256 KB. A string que introduzir aqui é usada tal como está para executar gcloud storage. Se o startup-script-url contiver carateres de espaço, não substitua os espaços por %20 nem adicione aspas ("") à string startup-script-url.

Ordem de execução dos scripts de arranque do Linux

Pode usar vários scripts de arranque. Os scripts de arranque armazenados localmente ou adicionados são executados diretamente antes dos scripts de arranque armazenados no Cloud Storage. A tabela seguinte mostra, com base na chave de metadados, a ordem de execução dos scripts de arranque do Linux.

Chave de metadados Ordem de execução
startup-script Primeiro, durante cada arranque após o arranque inicial
startup-script-url Segundos durante cada arranque após o arranque inicial

Transmitir um script de arranque do Linux diretamente

Pode adicionar o conteúdo de um script de arranque diretamente a uma VM quando cria a VM. Os procedimentos seguintes mostram como criar uma VM com um script de arranque que instala o Apache e cria uma página Web básica.

Consola

Transmitir um script de arranque do Linux diretamente para uma nova VM

  1. Na Trusted Cloud consola, aceda à página Criar uma instância.

    Aceda a Criar uma instância

  2. Para usar um sistema operativo Linux, faça o seguinte:

    1. No menu de navegação, clique em SO e armazenamento.

    2. Clique em Alterar.

    3. No painel Disco de arranque apresentado, selecione um sistema operativo Linux.

  3. Para adicionar diretamente um script de arranque do Linux, faça o seguinte:

    1. No menu de navegação, clique em Avançadas.

    2. Na secção Automatização, introduza o seguinte no campo Script de arranque:

      #! /bin/bash
      apt update
      apt -y install apache2
      cat <<EOF > /var/www/html/index.html
      <html><body><p>Linux startup script added directly.</p></body></html>
      EOF
      
  4. Opcional: especifique outras opções de configuração. Para mais informações, consulte o artigo Opções de configuração durante a criação da instância.

  5. Para criar e iniciar a instância, clique em Criar.

Transmitir um script de arranque do Linux diretamente a uma VM existente

  1. Na Trusted Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Clique no Nome da instância.

  3. Clique em Edit.

  4. Em Automatização, adicione o conteúdo do script de arranque.

A validar o script de arranque

Depois de a instância ser iniciada, veja o IP externo num navegador de Internet para verificar se o script de arranque criou o Website. Pode ter de aguardar cerca de 1 minuto para que o script de arranque de exemplo termine.

gcloud

Transmitir um script de arranque do Linux diretamente para uma nova VM

Transmita o conteúdo de um script de arranque diretamente para uma VM quando a criar usando o seguinte gcloud compute instances create comando.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --metadata=startup-script='#! /bin/bash
  apt update
  apt -y install apache2
  cat <<EOF > /var/www/html/index.html
  <html><body><p>Linux startup script added directly.</p></body></html>
  EOF'

Substitua VM_NAME pelo nome da VM.

Transmitir um script de arranque do Linux diretamente a uma VM existente

Adicione o script de arranque diretamente a uma VM existente através do seguinte gcloud compute instances add-metadata comando:

gcloud compute instances add-metadata VM_NAME \
    --zone=ZONE \
    --metadata=startup-script='#! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script added directly.</p></body></html>
    EOF'

Substitua o seguinte:

  • VM_NAME: o nome da VM

  • ZONE: a zona da VM

A validar o script de arranque

Depois de iniciar a VM, veja o IP externo num navegador de Internet para verificar se o script de arranque criou o Website. Pode ter de aguardar cerca de 1 minuto para que o script de arranque de exemplo termine.

REST

Transmitir um script de arranque do Linux diretamente para uma nova VM

Transmita o conteúdo de um script de arranque diretamente para uma VM quando a criar através do seguinte instances.insertmétodo.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF"
      }
    ]
  },
  ...
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto onde a VM existe.

  • ZONE: a zona na qual criar a VM.

Transmitir um script de arranque do Linux diretamente a uma VM existente

  1. Obtenha o valor metadata.fingerprint da VM através do método instances.get:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto onde a VM existe.

    • ZONE: a zona da VM.

    • VM_NAME: o nome da VM.

  2. Transmita o script de arranque através do valor fingerprint, juntamente com a chave e o valor dos metadados para o script de arranque, numa chamada ao método instances.setMetadata:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
      "fingerprint": FINGERPRINT,
      "items": [
        {
          "key": "startup-script",
          "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF"
        }
      ],
      ...
    }
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto onde a VM existe.

    • ZONE: a zona da VM.

    • VM_NAME: o nome da VM.

    • FINGERPRINT: o valor metadata.fingerprint obtido através do método instances.get.

A validar o script de arranque

Depois de iniciar a VM, veja o IP externo num navegador de Internet para verificar se o script de arranque criou o Website. Pode ter de aguardar cerca de 1 minuto para que o script de arranque de exemplo termine.

Transmitir um script de arranque do Linux a partir de um ficheiro local

Pode armazenar um script de arranque num ficheiro local na sua estação de trabalho e transmitir o ficheiro local como metadados a uma VM quando a cria. Não pode usar ficheiros armazenados em VMs como scripts de arranque.

Antes de transmitir um script de arranque do Linux de um ficheiro local para uma VM, faça o seguinte:

  1. Crie um ficheiro local para armazenar o script de arranque.

  2. Tenha em atenção o caminho relativo da CLI gcloud para o script de arranque.

  3. Adicione o seguinte script de arranque ao ficheiro:

    #! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script from a local file.</p></body></html>
    EOF
    

gcloud

Transferir um script de arranque do Linux de um ficheiro local para uma nova VM

Crie uma VM e transmita o conteúdo de um ficheiro local para ser usado como o script de arranque através do comando gcloud compute instances create com a flag --metadata-from-file.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --metadata-from-file=startup-script=FILE_PATH

Substitua o seguinte:

  • VM_NAME: o nome da VM

  • FILE_PATH: o caminho relativo para o ficheiro de script de arranque

Transmitir um script de arranque do Linux de um ficheiro local para uma VM existente

Transmita um script de arranque a uma VM existente a partir de um ficheiro local através do seguinte gcloud compute instances add-metadata comando:

gcloud compute instances add-metadata VM_NAME \
  --zone=ZONE \
  --metadata-from-file startup-script=FILE_PATH

Substitua o seguinte:

  • VM_NAME: o nome da VM

  • ZONE: a zona da VM

  • FILE_PATH: o caminho relativo para o ficheiro de script de arranque

A validar o script de arranque

Veja o IP externo num navegador de Internet para verificar se o script de arranque criou o Website. Pode ter de aguardar cerca de 1 minuto para que o script de arranque de exemplo termine.

Transmitir um script de arranque do Linux a partir do Cloud Storage

Pode armazenar um script de arranque no Cloud Storage e transmiti-lo a uma VM quando a criar. Depois de adicionar um script de arranque ao Cloud Storage, tem um URL que pode usar para referenciar o script de arranque quando cria uma VM.

Antes de adicionar um script de arranque a partir de um contentor do Cloud Storage, faça o seguinte:

  1. Crie um ficheiro para armazenar o script de arranque. Este exemplo usa um ficheiro bash (.sh).

  2. Adicione o seguinte ao ficheiro bash, que instala o Apache e cria uma página Web simples:

    #! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script from Cloud Storage.</p></body></html>
    EOF
    
  3. Crie um contentor do Cloud Storage.

  4. Adicione o ficheiro ao contentor do Cloud Storage.

Implicações de segurança

  • Por predefinição, os proprietários e os editores de projetos podem aceder aos ficheiros do Cloud Storage no mesmo projeto, a menos que existam controlos de acesso explícitos que o impeçam.

  • Se o objeto ou o contentor do Cloud Storage for menos seguro do que os metadados, existe um risco de escalada de privilégios se o script de arranque for modificado e a VM for reiniciada. Isto deve-se ao facto de, após o reinício da VM, o script de arranque ser executado como root e, em seguida, poder usar as autorizações da conta de serviço anexada para aceder a outros recursos.

Limitações

Consola

Transmitir um script de arranque armazenado no Cloud Storage a uma nova VM

  1. Na Trusted Cloud consola, aceda à página Criar uma instância.

    Aceda a Criar uma instância

  2. Para usar um sistema operativo Linux, faça o seguinte:

    1. No menu de navegação, clique em SO e armazenamento.

    2. Na secção Sistema operativo e armazenamento, clique em Alterar. Em seguida, selecione um sistema operativo Linux.

  3. Para permitir que a instância aceda ao contentor do Cloud Storage que contém o script de arranque do Linux, faça o seguinte:

    1. No menu de navegação, clique em Segurança.

    2. Na lista Conta de serviço, selecione uma conta de serviço que tenha a função do IAM Storage Object Viewer (roles/storage.objectViewer) no contentor do Cloud Storage.

  4. Para adicionar um script de arranque do Linux especificando um ficheiro no Cloud Storage, faça o seguinte:

    1. No menu de navegação, clique em Avançadas.

    2. Na secção Metadados, clique em Adicionar item. São apresentados os campos Chave e Valor.

    3. No campo Chave, introduza startup-script-url.

    4. No campo Valor, introduza a localização do Cloud Storage do ficheiro de script de arranque usando um dos seguintes formatos:

      • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
      • URI do gcloud storage: gs://BUCKET/FILE

        Substitua o seguinte:

      • BUCKET: o nome do contentor que contém o ficheiro do script de arranque

      • FILE: o nome do ficheiro do script de arranque

  5. Opcional: especifique outras opções de configuração. Para mais informações, consulte o artigo Opções de configuração durante a criação da instância.

  6. Para criar e iniciar a instância, clique em Criar.

Transmitir um script de arranque armazenado no Cloud Storage a uma VM existente

  1. Na Trusted Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Clique no Nome da instância.

  3. Clique em Edit.

  4. Em Metadados, adicione os seguintes valores:

    • Chave: startup-script-url

    • Value: a localização do ficheiro de script de arranque no Cloud Storage usando um dos seguintes formatos:

      • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
      • URI do gcloud storage: gs://BUCKET/FILE

A validar o script de arranque

Veja o IP externo num navegador de Internet para verificar se o script de arranque criou o Website. Pode ter de aguardar cerca de 1 minuto para que o script de início de exemplo termine.

gcloud

Transmitir um script de arranque armazenado no Cloud Storage a uma nova VM

Transmita um script de arranque armazenado no Cloud Storage a uma VM quando a criar através do seguinte gcloud compute instances createcomando. Para o valor da flag --scope, use storage-ro para que a VM possa aceder ao Cloud Storage.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --scopes=storage-ro \
  --metadata=startup-script-url=CLOUD_STORAGE_URL

Substitua o seguinte:

  • VM_NAME: o nome da VM.

  • CLOUD_STORAGE_URL: o valor de metadados. Definido para a localização do Cloud Storage do ficheiro de script de arranque com um dos seguintes formatos:

    • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
    • URI do gcloud storage: gs://BUCKET/FILE

Transmitir um script de arranque armazenado no Cloud Storage a uma VM existente

Transmita um script de arranque armazenado no Cloud Storage para uma VM existente através do seguinte gcloud compute instances add-metadata comando:

gcloud compute instances add-metadata VM_NAME \
    --zone=ZONE \
    --metadata startup-script-url=CLOUD_STORAGE_URL

Substitua o seguinte:

  • VM_NAME: o nome da VM.

  • ZONE: a zona da VM.

  • CLOUD_STORAGE_URL: o valor de metadados. Definido para a localização do Cloud Storage do ficheiro de script de arranque com um dos seguintes formatos:

    • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
    • URI do gcloud storage: gs://BUCKET/FILE

A validar o script de arranque

Veja o IP externo num navegador de Internet para verificar se o script de arranque criou o Website. Pode ter de aguardar cerca de 1 minuto para que o script de início de exemplo termine.

REST

Transmitir um script de arranque armazenado no Cloud Storage a uma nova VM

Transmita um script de arranque armazenado no Cloud Storage a uma VM quando a criar através do seguinte instances.insertmétodo. No campo scopes, adicione https://www.googleapis.com/auth/devstorage.read_only para que a VM possa aceder ao Cloud Storage.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "serviceAccounts": [
    {
      "email": "default",
      "scopes": [
        "https://www.googleapis.com/auth/devstorage.read_only"
      ]
    }
  ],
  "metadata": {
    "items": [
      {
        "key": "startup-script-url",
        "value": "CLOUD_STORAGE_URL"
      }
    ]
  },
  ...
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto.

  • ZONE: a zona na qual criar a VM.

  • CLOUD_STORAGE_URL: o valor de metadados. Definido para a localização do Cloud Storage do ficheiro de script de arranque com um dos seguintes formatos:

    • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
    • URI do gcloud storage: gs://BUCKET/FILE

Transmitir um script de arranque armazenado no Cloud Storage a uma VM existente

  1. Obtenha o valor metadata.fingerprint da VM através do método instances.get:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto

    • ZONE: a zona da VM

    • VM_NAME: o nome da VM

  2. Transmita o script de arranque através do valor fingerprint, juntamente com a chave e o valor dos metadados para o script de arranque, numa chamada ao método instances.setMetadata:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
      "fingerprint": FINGERPRINT,
      "items": [
        {
            "key": "startup-script-url",
            "value": "CLOUD_STORAGE_URL"
        }
      ],
      ...
    }
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto.

    • ZONE: a zona da VM.

    • VM_NAME: o nome da VM.

    • FINGERPRINT: o valor metadata.fingerprint obtido através do método instances.get.

    • CLOUD_STORAGE_URL: o valor de metadados. Defina a localização do ficheiro de script de arranque no Cloud Storage com um dos seguintes formatos:

      • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
      • URI do gcloud storage: gs://BUCKET/FILE

A validar o script de arranque

Veja o IP externo num navegador de Internet para verificar se o script de arranque criou o Website. Pode ter de aguardar cerca de 1 minuto para que o script de início de exemplo termine.

Aceder a metadados a partir de um script de arranque do Linux

Num script de arranque, pode aceder aos valores dos metadados. Por exemplo, pode usar o mesmo script para várias VMs e parametrizar cada script individualmente transmitindo diferentes valores de metadados a cada VM.

Para aceder a um valor de metadados personalizado a partir de um script de arranque, faça o seguinte:

  1. Crie um script de arranque que consulte o valor de uma chave de metadados. Por exemplo, o script de arranque do ficheiro bash (.sh) seguinte consulta o valor da chave de metadados foo.

    #! /bin/bash
    METADATA_VALUE=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo -H "Metadata-Flavor: Google")
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Accessing metadata value of foo: $METADATA_VALUE</p></body></html>
    EOF
    
  2. Defina o valor da chave de metadados foo quando criar uma VM através do seguinte gcloud compute instances createcomando. Para este exemplo, o script de arranque é transmitido à VM a partir de um ficheiro local.

    gcloud

    gcloud compute instances create VM_NAME \
      --image-project=debian-cloud \
      --image-family=debian-10 \
      --metadata-from-file=startup-script=FILE_PATH \
      --metadata=foo=bar
    

    Substitua o seguinte:

    • VM_NAME: o nome da VM

    • FILE_PATH: o caminho relativo para o ficheiro de script de arranque

    Para mais informações sobre como especificar um par de chave/valor de metadados, consulte o artigo Definir metadados personalizados.

  3. Na sua estação de trabalho local, veja o IP externo num navegador de Internet para verificar se o script de arranque produz o valor de foo. Pode ter de aguardar cerca de 1 minuto para que o script de arranque de exemplo termine.

Voltar a executar um script de arranque do Linux

Volte a executar um script de arranque fazendo o seguinte:

  1. A estabelecer ligação à VM.

  2. Executando o seguinte comando:

    sudo google_metadata_script_runner startup

Ver a saída de um script de arranque do Linux

Pode ver o resultado de um script de arranque do Linux através de qualquer uma das seguintes ações:

O que se segue?