Como usar scripts de inicialização em VMs do Linux


Um script de inicialização é um arquivo que executa tarefas durante o processo de inicialização de uma instância de máquina virtual (VM, na sigla em inglês). Os scripts de inicialização podem ser aplicados a todas as VMs em um projeto ou a uma única VM. Os scripts de inicialização especificados pelos metadados da VM modificam os scripts de inicialização especificados pelos metadados do projeto, e os scripts de inicialização são executados apenas quando uma rede está disponível. Neste documento, descrevemos como usar scripts de inicialização em instâncias de VM do Linux. Saiba mais sobre como adicionar um script de inicialização no nível do projeto em gcloud compute project-info add-metadata.

Para scripts de inicialização do Linux, você pode usar um arquivo bash ou não bash. Para usar um arquivo não bash, designe o intérprete adicionando um #! à parte superior do arquivo. Por exemplo, para usar um script de inicialização do Python 3, adicione #! /usr/bin/python3 na parte superior do arquivo.

Se você especificar um script de inicialização usando um dos procedimentos neste documento, o Compute Engine:

  1. Copiará o script de inicialização na VM

  2. Definirá as permissões de execução no script de inicialização

  3. Executará o script de inicialização como o usuário root quando a VM for inicializada

Para informações sobre as várias tarefas relacionadas a scripts de inicialização e quando executar cada um, consulte a Visão geral.

Antes de começar

  • Leia a visão geral dos scripts de inicialização.
  • Leia sobre o servidor de metadados.
  • Configure a autenticação, caso ainda não tenha feito isso. A autenticação é o processo de verificação da sua identidade para acesso a serviços e APIs do Google Cloud. Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-se no Compute Engine da seguinte maneira.

    Selecione a guia para como planeja usar as amostras nesta página:

    Console

    Quando você usa o console do Google Cloud para acessar os serviços e as APIs do Google Cloud, não é necessário configurar a autenticação.

    gcloud

    1. Instale a Google Cloud CLI e inicialize-a executando o seguinte comando:

      gcloud init
    2. Defina uma região e uma zona padrão.

    REST

    Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para a CLI gcloud.

      Instale a Google Cloud CLI e inicialize-a executando o seguinte comando:

      gcloud init

Chaves de metadados para scripts de inicialização do Linux

Um script de inicialização é transmitido para uma VM a partir de um local especificado por uma chave de metadados. Uma chave de metadados especifica se o script de inicialização está armazenado localmente ou no Cloud Storage ou transmitido diretamente para a VM. A chave de metadados usada também pode depender do tamanho do script de inicialização.

A tabela a seguir mostra as chaves de metadados que podem ser usadas para scripts de inicialização do Linux e fornece informações sobre qual chave usar com base no local de armazenamento e no tamanho do script de inicialização.

Chave de metadados Use para
startup-script Transmitir um script de inicialização bash ou não bash armazenado localmente ou adicionado diretamente de até 256 KB
startup-script-url Transmitir um script de inicialização bash ou não bash armazenado no Cloud Storage e que seja maior que 256 KB. A string inserida aqui é usada como está para executar gsutil. Se a startup-script-url tiver caracteres de espaço, não substitua os espaços por %20 nem adicione aspas duplas ("") à string startup-script-url.

Ordem de execução de scripts de inicialização do Linux

É possível usar vários scripts de inicialização. Scripts de inicialização armazenados localmente ou adicionados diretamente são executados antes de scripts de inicialização armazenados no Cloud Storage. A tabela a seguir mostra, com base na chave de metadados, a ordem de execução dos scripts de inicialização do Linux.

Chave de metadados Ordem de execução
startup-script Primeiro durante cada inicialização após a inicialização inicial
startup-script-url Segundo durante cada inicialização após a inicialização inicial

Como transmitir um script de inicialização do Linux diretamente

É possível adicionar o conteúdo de um script de inicialização diretamente a uma VM ao criá-la. Os procedimentos a seguir mostram como criar uma VM com um script de inicialização que instala o Apache e cria uma página da Web básica.

Console

Como transmitir um script de inicialização do Linux diretamente para uma nova VM

  1. No Console do Google Cloud, acesse a página Criar uma instância.

    Acesse "Criar uma instância"

  2. Em Disco de inicialização, selecione Alterar e escolha um sistema operacional Linux.

  3. Expanda a seção Opções avançadas e faça isto:

    1. Expanda a seção Gerenciamento.
    2. Na seção Automação, adicione o seguinte script de inicialização:

       #! /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. Clique em Criar.

Como transmitir um script de inicialização do Linux diretamente para uma VM existente

  1. No console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar instâncias de VM

  2. Clique no Nome da VM.

  3. Clique em Editar.

  4. Em Automação, adicione o conteúdo do script de inicialização.

Como verificar o script de inicialização

Depois que a VM for iniciada, visualize o IP externo em um navegador da Web para verificar se o script de inicialização criou o site. Talvez seja necessário aguardar cerca de um minuto para que o script de inicialização de amostra seja concluído.

gcloud

Como transmitir um script de inicialização do Linux diretamente para uma nova VM

Transmita o conteúdo de um script de inicialização diretamente para uma VM ao criá-la usando o seguinte comando gcloud compute instances create.

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.

Como transmitir um script de inicialização do Linux diretamente para uma VM existente

Adicione o script de inicialização diretamente a uma VM atual usando o seguinte comando gcloud compute instances add-metadata:

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:

  • VM_NAME: o nome da VM

  • ZONE: a zona da VM

Como verificar o script de inicialização

Depois que a VM for iniciada, visualize o IP externo em um navegador da Web para verificar se o script de inicialização criou o site. Talvez seja necessário aguardar cerca de um minuto para que o script de inicialização de amostra seja concluído.

REST

Como transmitir um script de inicialização do Linux diretamente para uma nova VM

Transmita o conteúdo de um script de inicialização diretamente para uma VM ao criá-la usando o seguinte método instances.insert.

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:

  • PROJECT_ID: o ID do projeto

  • ZONE: a zona em que a VM será criada

Como transmitir um script de inicialização do Linux diretamente para uma VM existente

  1. Receba o valor tags.fingerprint da VM usando o método instances.get.

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

    Substitua:

    • PROJECT_ID: o ID do projeto

    • ZONE: a zona da VM

    • VM_NAME: a zona da VM

  2. Transmita o script de inicialização usando o valor fingerprint com a chave e o valor de metadados do script de inicialização em uma chamada para o 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:

    • PROJECT_ID: o ID do projeto

    • ZONE: a zona da VM

    • VM_NAME: a zona da VM

    • FINGERPRINT: o valor tags.fingerprint recebido usando o método instances.get

Como verificar o script de inicialização

Depois que a VM for iniciada, visualize o IP externo em um navegador da Web para verificar se o script de inicialização criou o site. Talvez seja necessário aguardar cerca de um minuto para que o script de inicialização de amostra seja concluído.

Como transmitir um script de inicialização do Linux de um arquivo local

É possível armazenar um script de inicialização em um arquivo local na estação de trabalho e transmitir o arquivo local como metadados para uma VM ao criá-la. Não é possível usar arquivos armazenados em VMs como scripts de inicialização.

Antes de transmitir um script de inicialização do Linux de um arquivo local para uma VM, faça o seguinte:

  1. Crie um arquivo local para armazenar o script de inicialização.

  2. Observe o caminho relativo da CLI gcloud para o script de inicialização.

  3. Adicione o seguinte script de inicialização ao arquivo:

    #! /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

Como transmitir um script de inicialização do Linux de um arquivo local para uma nova VM

Crie uma VM e transmita o conteúdo de um arquivo local a ser usado como o script de inicialização utilizando o comando gcloud compute instances create com a sinalização --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:

  • VM_NAME: o nome da VM

  • FILE_PATH: o caminho relativo para o arquivo de script de inicialização

Como transmitir um script de inicialização do Linux de um arquivo local para uma VM atual

Transmita um script de inicialização para uma VM atual a partir de um arquivo local usando o seguinte comando gcloud compute instances add-metadata:

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

Substitua:

  • VM_NAME: o nome da VM

  • ZONE: a zona da VM

  • FILE_PATH: o caminho relativo para o arquivo de script de inicialização

Como verificar o script de inicialização

Visualize o IP externo em um navegador da Web para verificar se o script de inicialização criou o site. Talvez seja necessário aguardar cerca de um minuto para que o script de inicialização de amostra seja concluído.

Como transmitir um script de inicialização do Linux do Cloud Storage

É possível armazenar um script de inicialização no Cloud Storage e transmiti-lo para uma VM ao criá-la. Depois de adicionar um script de inicialização ao Cloud Storage, você tem um URL que pode ser utilizado para fazer referência ao script de inicialização ao criar uma VM.

Antes de adicionar um script de inicialização a partir de um bucket do Cloud Storage, faça o seguinte:

  1. Crie um arquivo para armazenar o script de inicialização. Este exemplo usa um arquivo bash (.sh).

  2. Adicione o seguinte comando ao arquivo bash, que instala o Apache e cria uma página da 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 bucket do Cloud Storage.

  4. Adicione o arquivo no bucket do Cloud Storage.

Implicações de segurança

  • Por padrão, os proprietários e editores de projetos podem acessar arquivos do Cloud Storage no mesmo projeto, a menos que haja controles de acesso explícitos que impeçam esse acesso.

  • Se o bucket ou objeto do Cloud Storage for menos seguro que os metadados, haverá risco de escalonamento de privilégios se o script de inicialização for modificado e a VM for reinicializada. Isso ocorre porque, após a reinicialização da VM, o script de inicialização é executado como root e pode usar as permissões da conta de serviço anexada para acessar outros recursos.

Limitações

Console

Como transmitir um script de inicialização armazenado no Cloud Storage para uma nova VM

  1. No Console do Google Cloud, acesse a página Criar uma instância.

    Acesse "Criar uma instância"

  2. Especifique os detalhes da VM.

  3. Em Disco de inicialização, selecione Alterar e escolha um sistema operacional Linux.

  4. Na seção Identidade e acesso à API, selecione uma conta de serviço que tenha o papel Leitor de objetos do Storage (roles/storage.objectViewer).

  5. Expanda a seção Opções avançadas e depois faça o seguinte:

    1. Expanda a seção Gerenciamento.
    2. Na seção Metadados, adicione valores para:

      • Chave: a chave de metadados. Defina como startup-script-url para adicionar um script de inicialização pelo Cloud Storage.

      • Valor: o valor dos metadados. Defina como o local do Cloud Storage do arquivo de script de inicialização usando um dos seguintes formatos:

        • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
        • URI da gsutil: gs://BUCKET/FILE

        Substitua:

        • BUCKET: o nome do bucket que contém o arquivo de script de inicialização
        • FILE: o nome do arquivo de script de inicialização
  6. Para criar a VM, clique em Criar.

Como transmitir um script de inicialização armazenado no Cloud Storage para uma VM atual

  1. No Console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar instâncias de VM

  2. Clique no Nome da VM.

  3. Clique em Editar.

  4. Em Metadados, adicione os seguintes valores:

    • Chave: startup-script-url

    • Valor: o local do Cloud Storage do arquivo de script de inicialização usando um dos formatos a seguir:

      • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
      • URI da gsutil: gs://BUCKET/FILE

Como verificar o script de inicialização

Visualize o IP externo em um navegador da Web para verificar se o script de inicialização criou o site. Talvez seja necessário aguardar cerca de um minuto para que o script de inicialização de amostra seja concluído.

gcloud

Como transmitir um script de inicialização armazenado no Cloud Storage para uma nova VM

Transmita um script de inicialização armazenado no Cloud Storage para uma VM ao criá-la usando o seguinte comando gcloud compute instances create. Para o valor da sinalização --scope, use storage-ro para que a VM possa acessar o 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:

  • VM_NAME: o nome da VM.

  • CLOUD_STORAGE_URL: o valor dos metadados. Defina como o local do Cloud Storage do arquivo de script de inicialização usando um dos seguintes formatos:

    • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
    • URI da gsutil: gs://BUCKET/FILE

Como transmitir um script de inicialização armazenado no Cloud Storage para uma VM atual

Transmita um script de inicialização armazenado no Cloud Storage para uma VM atual usando o seguinte comando gcloud compute instances add-metadata:

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

Substitua:

  • VM_NAME: o nome da VM.

  • ZONE: a zona da VM.

  • CLOUD_STORAGE_URL: o valor dos metadados. Defina como o local do Cloud Storage do arquivo de script de inicialização usando um dos seguintes formatos:

    • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
    • URI da gsutil: gs://BUCKET/FILE

Como verificar o script de inicialização

Visualize o IP externo em um navegador da Web para verificar se o script de inicialização criou o site. Talvez seja necessário aguardar cerca de um minuto para que o script de inicialização de amostra seja concluído.

REST

Como transmitir um script de inicialização armazenado no Cloud Storage para uma nova VM

Transmita um script de inicialização armazenado no Cloud Storage para uma VM ao criá-la usando o seguinte método instances.insert. No campo scopes, adicione https://www.googleapis.com/auth/devstorage.read_only para que a VM possa acessar o 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:

  • PROJECT_ID: o ID do projeto;

  • ZONE: a zona em que a nova VM será criada.

  • CLOUD_STORAGE_URL: o valor dos metadados. Defina como o local do Cloud Storage do arquivo de script de inicialização usando um dos seguintes formatos:

    • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
    • URI da gsutil: gs://BUCKET/FILE

Como transmitir um script de inicialização armazenado no Cloud Storage para uma VM atual

  1. Receba o valor tags.fingerprint da VM usando o método instances.get.

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

    Substitua:

    • PROJECT_ID: o ID do projeto

    • ZONE: a zona da VM

    • VM_NAME: a zona da VM

  2. Transmita o script de inicialização usando o valor fingerprint com a chave e o valor de metadados do script de inicialização em uma chamada para o 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:

    • PROJECT_ID: o ID do projeto;

    • ZONE: a zona da VM.

    • VM_NAME: a zona da VM.

    • FINGERPRINT: o valor tags.fingerprint recebido usando o método instances.get.

    • CLOUD_STORAGE_URL: o valor dos metadados. Defina como o local do Cloud Storage do arquivo de script de inicialização usando um dos seguintes formatos:

      • URL autenticado: https://storage.googleapis.com/BUCKET/FILE
      • URI da gsutil: gs://BUCKET/FILE

Como verificar o script de inicialização

Visualize o IP externo em um navegador da Web para verificar se o script de inicialização criou o site. Talvez seja necessário aguardar cerca de um minuto para que o script de inicialização de amostra seja concluído.

Como acessar metadados de um script de inicialização do Linux

Em um script de inicialização, é possível acessar valores de metadados. Por exemplo, é possível usar o mesmo script para várias VMs e parametrizar cada script individualmente transmitindo valores de metadados diferentes para cada VM.

Para acessar um valor de metadados personalizado em um script de inicialização, faça o seguinte:

  1. Crie um script de inicialização que consulte o valor de uma chave de metadados. Por exemplo, o script de inicialização de arquivo bash (.sh) a seguir 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 ao criar uma VM usando o seguinte comando gcloud compute instances create. Neste exemplo, o script de inicialização é transmitido para a VM a partir de um arquivo 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:

    • VM_NAME: o nome da VM

    • FILE_PATH: o caminho relativo para o arquivo de script de inicialização

    Para mais informações sobre como especificar um par de chave-valor/chave de metadados, consulte Como configurar metadados personalizados.

  3. Na estação de trabalho local, veja o IP externo em um navegador da Web para verificar se o script de inicialização gera o valor foo. Talvez seja necessário aguardar cerca de um minuto para que o script de inicialização de amostra seja concluído.

Como executar um script de inicialização do Linux novamente

Execute novamente um script de inicialização:

  1. Como se conectar à VM.

  2. Executando o seguinte comando:

    sudo google_metadata_script_runner startup
    

Como visualizar a saída de um script de inicialização do Linux

É possível visualizar a saída em um script de inicialização do Linux seguindo um destes procedimentos:

A seguir