Executar scripts de inicialização

Crie e execute seus próprios scripts de inicialização nas máquinas virtuais para cumprir tarefas automatizadas toda vez que sua instância for inicializada. Os scripts de inicialização podem executar muitas ações, como instalação de software, execução de atualizações, ativação de serviços e quaisquer outras tarefas definidas no script. Você pode usar scripts de inicialização para personalizar as instâncias de máquinas virtuais de maneira fácil e programática. Isso se aplica até mesmo a instâncias novas no momento da criação.

Veja a seguir um exemplo de um script de inicialização simples que instala e inicia um servidor Apache:

#! /bin/bash
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple startup script!</p>
</body></html>
EOF

Um script de inicialização é especificado por meio do servidor de metadados. Isso é feito com o uso de chaves de metadados de script de inicialização. Use a ferramenta de linha de comando gcloud, a API ou o Console do Google Cloud Platform para fornecer um script de inicialização.

Antes de começar

Permissões necessárias para esta tarefa

Para executar esta tarefa, é preciso ter as permissões abaixo.

Execução do script de inicialização

A instância sempre executa os scripts de inicialização como raiz depois que a rede está disponível.

Um script de inicialização pode ser um arquivo de qualquer tipo. Quando há um script de inicialização presente, o Compute Engine:

  1. copia o script de inicialização em um arquivo local na instância;
  2. define as permissões no arquivo para torná-lo executável;
  3. executa o arquivo.

Você pode, por exemplo, fornecer um script Python em vez de um script bash. Lembre-se de que o Compute Engine executará o script na íntegra, independentemente do tipo de script.

Para executar um script que não é bash, adicione uma linha shebang na parte superior do arquivo para permitir que o sistema operacional saiba qual intérprete usar. Por exemplo, para um script Python, adicione uma linha shebang como:

#! /usr/bin/python

Como usar um script de inicialização local

Os scripts de inicialização local ficam armazenados no seu computador. Para usá-los, transmita um arquivo de script de inicialização local ou forneça o conteúdo de um script desse tipo diretamente para o servidor de metadados. Os exemplos nas subseções seguintes mostram como adicionar metadados de script de inicialização por meio de um arquivo local ou por inserção direta.

Os scripts de inicialização local estão sujeitos ao limite de comprimento do valor de metadados de 256 KB. Se seu script de inicialização exceder esse limite, você não poderá carregá-lo localmente. Em vez disso, salve seu arquivo no Google Cloud Storage e especifique o URL do script no momento da criação da instância. Consulte Usar um script de inicialização armazenado no Cloud Storage para ver mais informações.

Fornecer um arquivo de script de inicialização

Você só pode passar um arquivo de script de inicialização local por meio da ferramenta de linha de comando gcloud.

Para passar um arquivo de script de inicialização local, use a ferramenta de linha de comando gcloud e forneça a sinalização --metadata-from-file, seguida por um par de chaves de metadados startup-script=PATH/TO/FILE, em que PATH/TO/FILE é um caminho relativo para o script de inicialização:

gcloud compute instances create example-instance \
    --metadata-from-file startup-script=examples/scripts/install.sh

Fornecer conteúdo do script de inicialização diretamente

Como alternativa, use o console, a ferramenta de linha de comando gcloud ou a API para digitar ou colar diretamente o conteúdo do seu script de inicialização.

Console

No Console do GCP, especifique um script de inicialização diretamente na seção Script de inicialização:

  1. No Console do GCP, acesse a página "Instâncias de VM".

    Acessar a página "Instâncias da VM"

  2. Clique em Criar instância.
  3. Na página Criar uma nova instância, preencha as propriedades desejadas da instância. Nas opções de configuração avançada, expanda a seção Gerenciamento, segurança, discos, rede, locatário único.
  4. Na seção Automatização, forneça o conteúdo do script de inicialização em Script de inicialização.

    Captura de tela de um script de inicialização no Console do GCP

  5. Clique em Criar para criar a instância.

gcloud

Com a ferramenta de linha de comando gcloud, especifique o sinalizador --metadata para fornecer o conteúdo do seu script de inicialização, usando o par de chaves startup-script=[CONTENTS], onde [CONTENTS] é o conteúdo do seu script de inicialização.

Por exemplo, o comando a seguir cria uma instância que, na inicialização, executa algumas atualizações do sistema, instala o Apache e inicia uma página da Web simples. Você pode executar este comando e visitar o endereço IP externo da instância para ver o conteúdo da página index.html.

Em um computador com Linux, execute o comando da seguinte maneira:

gcloud compute instances create example-instance --tags http-server \
--metadata startup-script='#! /bin/bash
# Installs apache and a custom homepage
sudo su -
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple start up script!</p>
</body></html>
EOF'

Em um computador com Windows, é possível executar este comando em um terminal cmd:

gcloud compute instances create example-instance --tags http-server --metadata startup-script="
apt-get update;
apt-get install -y apache2;
echo \"This page was created from a simple start up script!\" ^> /var/www/html/index.html"

Da mesma forma, se estiver usando o Powershell, execute o comando usando o rótulo --% para transmitir o comando exato à ferramenta gcloud:

gcloud --% compute instances create example-instance --tags http-server --metadata startup-script="
apt-get update;
apt-get install -y apache2;
echo \"This page was created from a simple start up script!\" ^> /var/www/html/index.html"

API

Na API, forneça um script de inicialização como parte da propriedade de metadados em sua solicitação, usando startup-script como a chave de metadados:

POST https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances

{
  ...
  "metadata": {
    "items": [
      {
       "key": "startup-script",
       "value": "#! /bin/bash\n\n# Installs apache and a custom homepage\napt-get update\napt-get install -y apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><h1>Hello World</h1>\n<p>This page was created from a simple start up script!</p>\n</body></html>"
      }
    ]
  }
  ...
}

Fornecer um script de inicialização para instâncias do Windows

Você pode executar scripts de inicialização em instâncias do Windows usando chaves de metadados únicas específicas desse sistema operacional. Escolha entre as chaves especializadas listadas a seguir. Cada chave deve corresponder ao tipo de script que você quer executar. Você também pode especificar vários scripts ao passar chaves diferentes para a instância. Cada chave só pode ser especificada uma vez por instância.

As chaves a seguir podem ser usadas com um script de inicialização local, com o uso das mesmas instruções vistas anteriormente.

Tipo de script Executado durante o sysprep, antes da inicialização Executado após a conclusão do sysprep e em cada inicialização subsequente
Scripts de inicialização url sysprep-specialize-script-url windows-startup-script-url
Scripts de inicialização cmd sysprep-specialize-script-cmd windows-startup-script-cmd
Scripts de inicialização bat sysprep-specialize-script-bat windows-startup-script-bat
Scripts de inicialização ps11 sysprep-specialize-script-ps1 windows-startup-script-ps1

Como fornecer um script de inicialização armazenado no Google Cloud Storage

Você pode armazenar o script no Google Cloud Storage e fornecer o URL para o script durante a criação da instância. Com isso é possível acessar o script de inicialização de qualquer lugar e também ignorar o limite do servidor de metadados.

Definir permissões de acesso ao script

É preciso ter permissão de acesso ao script de inicialização para usá-lo no Google Cloud Storage. Verifique as configurações de controle de acesso no intervalo e no arquivo para garantir que você tenha permissão.

Por padrão, se você for um proprietário ou editor do projeto, será possível acessar arquivos no mesmo projeto, a menos que haja controles de acesso explícitos que impeçam esse acesso.

Fornecer um script de inicialização

  1. Crie um intervalo. Use um intervalo atual ou crie um novo. Para saber como fazer isso, consulte Como criar um intervalo no Console do Google Cloud Platform ou Como criar um intervalo no gsutil.
  2. Faça o upload do arquivo no intervalo. Siga as instruções se quiser usar o gsutil ou o Console do GCP para carregar um objeto.
  3. Forneça o URL para o arquivo de script de inicialização ao criar uma nova instância.

    Console

    1. No Console do GCP, acesse a página "Instâncias de VM".

      Acessar a página "Instâncias da VM"

    2. Clique em Criar instância.
    3. Na página Criar uma nova instância, preencha as propriedades desejadas da instância. Nas opções de configuração avançada, expanda a seção Gerenciamento, segurança, discos, rede, locatário único.
    4. Na seção Metadados, forneça o startup-script-url como a chave de metadados.
    5. Na caixa Valor, forneça um URL para o arquivo de script de inicialização no formato gs://[BUCKET]/[FILE] ou https://storage.googleapis.com/[BUCKET]/[FILE].
    6. Na seção Identidade e acesso à API, selecione uma conta de serviço com acesso de leitura do arquivo do script de inicialização no Cloud Storage. Por exemplo, a conta de serviço deve ter as permissões do papel Visualizador de objetos do Storage.
    7. Clique em Criar para criar a instância.

    gcloud

    Usando a ferramenta de linha de comando gcloud, crie uma instância com as sinalizações --scopes e --metadata e especifique a chave startup-script-url. Com a sinalização --scopes, a máquina virtual tem acesso ao Google Cloud Storage para fazer o download do script de inicialização. Você pode fornecer o URL do Google Cloud Storage ao script no formato gs://bucket/file ou https://storage.googleapis.com/bucket/file.

    gcloud compute instances create example-instance --scopes storage-ro \
        --metadata startup-script-url=gs://bucket/startupscript.sh
    

    API

    Na API, forneça um script de inicialização como parte da propriedade de metadados em sua solicitação, usando startup-script-url como a chave de metadados. Além disso, forneça uma lista de scopes, com um escopo do Google Cloud Storage para que a máquina virtual possa acessar o arquivo do script de inicialização:

    POST https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances
    
    {
      ...
      "serviceAccounts": [
        {
          "email": "default",
          "scopes": [
            "https://www.googleapis.com/auth/devstorage.read_only"
          ]
        }
      ],
      "metadata": {
        "items": [
          {
           "key": "startup-script-url",
           "value": "gs://bucket/myfile"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/n1-standard-1",
      "name": "example-instance"
    }
    

    Windows

    Usando a ferramenta de linha de comando gcloud, crie uma instância com as sinalizações --scopes e --metadata e especifique a chave windows-startup-script-url. Com a sinalização --scopes, a máquina virtual tem acesso ao Google Cloud Storage para fazer o download do script de inicialização. Você pode fornecer o URL do Google Cloud Storage ao script no formato gs://bucket/file ou https://storage.googleapis.com/bucket/file.

    gcloud compute instances create example-windows-instance --scopes storage-ro \
       --metadata windows-startup-script-url=gs://bucket/startupscript.ps1
    

Aplicar um script de inicialização a instâncias em execução

Se houver uma instância em execução, adicione um script de inicialização a ela. Na próxima reinicialização da instância, esse script será executado. O script de inicialização também será executado em todas as reinicializações subsequentes.

Siga estas instruções para definir um script de inicialização em uma instância em execução.

Console

  1. Acesse a página Instâncias de VM.
  2. Clique na instância para que você quer adicionar um script de inicialização. A página de detalhes da instância é aberta.
  3. Na página "Detalhes da instância", conclua as etapas a seguir:

    1. Clique no botão Editar na parte superior da página.
    2. Em Metadados personalizados, clique em Adicionar item.
    3. Adicione o script de inicialização usando uma das chaves a seguir:

      • startup-script: forneça o conteúdo do script de inicialização diretamente com esta chave.
      • startup-script-url: forneça um URL do Google Cloud Storage para o arquivo de script inicial com esta chave.

gcloud

Com a ferramenta de linha de comando gcloud, use instances add-metadata para adicionar metadados à instância. Use qualquer uma das chaves de script de inicialização disponíveis:

  • --metadata startup-script=CONTENTS: forneça o conteúdo do script de inicialização diretamente com esta chave.
  • --metadata startup-script-url=URL: forneça um URL do Google Cloud Storage para o arquivo de script inicial com esta chave.
  • --metadata-from-file startup-script=FILE: forneça um arquivo de script de inicialização armazenado localmente.

Exemplo:

gcloud compute instances add-metadata example-instance \
    --metadata-from-file startup-script=path/to/file
gcloud compute instances add-metadata example-instance \
    --metadata startup-script-url=gs://bucket/file

API

Na API, faça uma solicitação ao método instances().setMetadata, fornecendo os novos metadados e um valor fingerprint.

Uma impressão digital é uma string de caracteres aleatória gerada pelo Compute Engine. Ela é utilizada para realizar o bloqueio otimista. Forneça o valor de impressão digital correspondente para executar sua solicitação. A impressão digital muda após cada solicitação. Solicitações com impressões digitais incompatíveis são rejeitadas. Dessa forma, apenas uma atualização pode ser feita por vez, evitando conflitos.

Para conseguir a impressão digital atual de uma instância, execute uma solicitação instances().get e copie o valor da impressão digital:

GET https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance
{

 ...
 "name": "example-instance",
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "zhma6O1w2l8="
 },
 "...
}

Em seguida, faça uma solicitação para o método instances().setMetadata, usando uma das chaves de metadados a seguir e o valor da impressão digital:

  • startup-script: forneça o conteúdo do script de inicialização diretamente com esta chave.
  • startup-script-url: forneça um URL do Google Cloud Storage para o arquivo de script de inicialização com esta chave.

Exemplo:

POST https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance/setMetadata

{
 "fingerprint": "zhma6O1w2l8=",
 "items": [
  {
   "key": "startup-script-url",
   "value": "gs://bucket/file"
  }
 ]
}

Executar um script de inicialização novamente

Você pode forçar uma nova execução dos scripts de inicialização na instância da VM. Para isso, conecte-se à instância e execute um dos comandos a seguir:

Nas imagens de Debian, CentOS, RHEL, SLES, SO otimizado para contêiner e Ubuntu:

$ sudo google_metadata_script_runner --script-type startup --debug

startup-script: INFO Starting startup scripts.
startup-script: INFO startup-script: Return code 0.
startup-script: INFO Finished running startup scripts.

No SO otimizado para contêiner, também é possível usar journalctl para ver a saída do script de inicialização.

$ sudo journalctl -u google-startup-scripts.service

O resultado do script de inicialização é gravado nos arquivos de registro a seguir:

  • CentOS e RHEL: /var/log/messages
  • Debian: /var/log/daemon.log
  • Ubuntu 14.04, 16.04 e 16.10: /var/log/syslog
  • SLES 11 e 12: /var/log/messages

Como definir valores personalizados em scripts de inicialização

Pode haver situações em que é preferível usar valores personalizados no script de inicialização durante a execução dele em instâncias. Por exemplo, pode ser útil executar um script de inicialização em instâncias diferentes e fazer com que cada instância gere uma mensagem personalizada.

Você pode especificar esses valores personalizados como pares de chave/valor de metadados personalizados no momento da criação da instância e referir-se a eles nos scripts de inicialização. Para ter mais informações sobre como criar chaves de metadados personalizadas, leia Definir metadados personalizados.

Depois de definir um par de chaves de metadados personalizadas, você pode modificar o script de inicialização para consultar os metadados novos. Por exemplo, o mesmo script acima pode ser modificado da seguinte maneira:

#! /bin/bash
VALUE_OF_FOO=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo -H "Metadata-Flavor: Google")
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>The value of foo: $VALUE_OF_FOO</p>
</body></html>
EOF

Solução de problemas

Conectividade de rede com o servidor de metadados

Especificamente para máquinas virtuais Linux, o Compute Engine aguardará uma conexão com o servidor de metadados antes de tentar conseguir informações desse servidor, como um script personalizado de inicialização ou desligamento. Se o servidor de metadados não estiver respondendo ou se a rede ainda não estiver configurada, a máquina virtual não terminará a inicialização.

Especificamente para máquinas virtuais Linux com imagens anteriores à versão v20160606, a saída da porta serial exibirá a mensagem "Waiting for metadata server, attempt N", em que N é o número de tentativas realizadas.

Esse problema pode durar até sete minutos por causa de um problema de rede temporário que se resolverá sozinho. Se o problema não se resolver depois de sete minutos, recrie a instância de máquina virtual.

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine