Usando scripts de inicialização em VMs 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). Os scripts de inicialização podem ser aplicados a todas as VMs de um projeto ou a uma única VM. Os scripts de inicialização especificados pelos metadados no nível da VM substituem os scripts de inicialização especificados pelos metadados no 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 inicialização em instâncias de VM do Linux. Para obter informações sobre como adicionar um script de inicialização no nível do projeto, consulte 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 #! para o topo do arquivo. Por exemplo, para usar um script de inicialização do Python 3, adicione #! /usr/bin/python3 no topo do arquivo.

Se você especificar um script de inicialização usando um dos procedimentos deste documento, o Compute Engine fará o seguinte:

  1. Copia o script de inicialização para a VM

  2. Define permissões de execução no script de inicialização

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

Para obter informações sobre as diversas tarefas relacionadas aos scripts de inicialização e quando executar cada uma delas, consulte Visão Geral .

Antes de começar

  • Leia a visão geral dos scripts de inicialização .
  • Leia sobre o servidor de metadados .
  • Se ainda não o fez, configure a autenticação. Autenticação é o processo pelo qual sua identidade é verificada para acesso a Google Cloud serviços e APIs. Para executar códigos ou amostras em um ambiente de desenvolvimento local, você pode se autenticar 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 Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.
    3. REST

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

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

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

Um script de inicialização é passado 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 é armazenado localmente, 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 você pode usar 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 Usar para
startup-script Passando um script de inicialização bash ou não bash que é armazenado localmente ou adicionado diretamente e que tem até 256 KB de tamanho
startup-script-url Transmitir um script de inicialização bash ou não bash armazenado no Cloud Storage e com tamanho superior a 256 KB. A string inserida aqui é usada como está para executar gcloud storage . Se o seu startup-script-url contiver caracteres de espaço, não substitua os espaços por %20 nem adicione aspas duplas ( "" ) à string startup-script-url .

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

Você pode usar vários scripts de inicialização. Os scripts de inicialização armazenados localmente ou adicionados diretamente são executados antes dos 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

Passando um script de inicialização do Linux diretamente

Você pode adicionar o conteúdo de um script de inicialização diretamente a uma VM ao criar a VM. Os procedimentos a seguir mostram como criar uma VM com um script de inicialização que instala o Apache e cria uma página web básica.

Console

Passando 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 .

    Vá para Criar uma instância

  2. Para usar um sistema operacional 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 inicialização exibido, selecione um sistema operacional Linux.

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

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

    2. Na seção Automação , insira o seguinte no campo 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. Opcional: Especifique outras opções de configuração. Para obter mais informações, consulte Opções de configuração durante a criação da instância .

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

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

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

    Acesse as instâncias de VM

  2. Clique no Nome da instância.

  3. Clique em Editar .

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

Verificando o script de inicialização

Depois que a instância 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 1 minuto para que o script de inicialização de amostra seja concluído.

gcloud

Passando 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 comando gcloud compute instances create a seguir.

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.

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

Adicione o script de inicialização diretamente a uma VM existente 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 o seguinte:

  • VM_NAME : o nome da VM

  • ZONE : a zona da VM

Verificando 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 1 minuto para que o script de inicialização de amostra seja concluído.

DESCANSAR

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

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

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

  • ZONE : a zona para criar a VM

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

  1. Obtenha 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 o seguinte:

    • PROJECT_ID : o ID do projeto

    • ZONE : a zona da VM

    • VM_NAME : a zona da VM

  2. Passe o script de inicialização usando o valor fingerprint , juntamente com a chave de metadados e o valor 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 o seguinte:

    • PROJECT_ID : o ID do projeto

    • ZONE : a zona da VM

    • VM_NAME : a zona da VM

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

Verificando 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 1 minuto para que o script de inicialização de amostra seja concluído.

Passando um script de inicialização do Linux a partir de um arquivo local

Você pode armazenar um script de inicialização em um arquivo local em sua estação de trabalho e passar o arquivo local como metadados para uma VM ao criá-lo. Você não pode usar arquivos armazenados em VMs como scripts de inicialização.

Antes de passar 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

Passando 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 para ser usado como script de inicialização usando 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 o seguinte:

  • VM_NAME : o nome da VM

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

Passando um script de inicialização do Linux de um arquivo local para uma VM existente

Transmita um script de inicialização para uma VM existente 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 o seguinte:

  • VM_NAME : o nome da VM

  • ZONE : a zona da VM

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

Verificando 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 1 minuto para que o script de inicialização de amostra seja concluído.

Passando um script de inicialização do Linux do Cloud Storage

Você pode armazenar um script de inicialização no Cloud Storage e passá-lo para uma VM ao criá-lo. Depois de adicionar um script de inicialização ao Cloud Storage, você terá um URL que poderá usar para fazer referência ao script de inicialização ao criar uma VM.

Antes de adicionar um script de inicialização 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 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 intervalo do Cloud Storage .

  4. Adicione o arquivo ao intervalo 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 não permitam isso.

  • Se o bucket ou objeto do Cloud Storage for menos seguro que os metadados, há 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

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 .

    Vá para Criar uma instância

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

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

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

  3. Para permitir que a instância acesse o bucket do Cloud Storage que contém o script de inicialização 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 Visualizador de objetos de armazenamento ( roles/storage.objectViewer ) no bucket do Cloud Storage.

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

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

    2. Na seção Metadados , clique em Adicionar item . Os campos Chave e Valor aparecem.

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

    4. No campo Valor , insira 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 de armazenamento gcloud : gs:// BUCKET / FILE

        Substitua o seguinte:

      • 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

  5. Opcional: Especifique outras opções de configuração. Para obter mais informações, consulte 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 inicialização armazenado no Cloud Storage para uma VM existente

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

    Acesse as instâncias de VM

  2. Clique no Nome da instância.

  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 seguintes formatos:

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

Verificando 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 1 minuto para que o script de inicialização de amostra seja concluído.

gcloud

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 comando gcloud compute instances create a seguir. 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 o seguinte:

  • VM_NAME : o nome da VM.

  • CLOUD_STORAGE_URL : o valor dos metadados. Defina 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 de armazenamento gcloud : gs:// BUCKET / FILE

Transmitir um script de inicialização armazenado no Cloud Storage para uma VM existente

Transmita um script de inicialização armazenado no Cloud Storage para uma VM existente 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 o seguinte:

  • VM_NAME : o nome da VM.

  • ZONE : a zona da VM.

  • CLOUD_STORAGE_URL : o valor dos metadados. Defina 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 de armazenamento gcloud : gs:// BUCKET / FILE

Verificando 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 1 minuto para que o script de inicialização de amostra seja concluído.

DESCANSAR

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 método instances.insert a seguir. Ao 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 o seguinte:

  • PROJECT_ID : o ID do projeto.

  • ZONE : a zona na qual criar a nova VM.

  • CLOUD_STORAGE_URL : o valor dos metadados. Defina 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 de armazenamento gcloud : gs:// BUCKET / FILE

Transmitir um script de inicialização armazenado no Cloud Storage para uma VM existente

  1. Obtenha 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 o seguinte:

    • PROJECT_ID : o ID do projeto

    • ZONE : a zona da VM

    • VM_NAME : a zona da VM

  2. Passe o script de inicialização usando o valor fingerprint , juntamente com a chave de metadados e o valor 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 o seguinte:

    • PROJECT_ID : o ID do projeto.

    • ZONE : a zona da VM.

    • VM_NAME : a zona da VM.

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

    • CLOUD_STORAGE_URL : o valor dos metadados. Defina 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 de armazenamento gcloud : gs:// BUCKET / FILE

Verificando 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 1 minuto para que o script de inicialização de amostra seja concluído.

Acessando metadados de um script de inicialização do Linux

Em um script de inicialização você pode acessar valores de metadados. Por exemplo, você pode usar o mesmo script para várias VMs e parametrizar cada script individualmente, passando diferentes valores de metadados para cada VM.

Para acessar um valor de metadados personalizado de 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 seguinte script de inicialização do arquivo bash ( .sh ) 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 comando gcloud compute instances create a seguir. Neste exemplo, o script de inicialização é passado 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 o seguinte:

    • VM_NAME : o nome da VM

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

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

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

Executando novamente um script de inicialização do Linux

Execute novamente um script de inicialização fazendo o seguinte:

  1. Conectando-se à VM .

  2. Executando o seguinte comando:

    sudo google_metadata_script_runner startup

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

Você pode visualizar a saída de um script de inicialização do Linux seguindo um destes procedimentos:

O que vem a seguir