Utilizzo degli script di avvio sulle VM Linux

Uno script di avvio è un file che esegue delle attività durante il processo di avvio di un'istanza di una macchina virtuale (VM). Gli script di avvio possono essere applicati a tutte le VM in un progetto o a una singola VM. Gli script di avvio specificati dai metadati a livello di VM sostituiscono gli script di avvio specificati dai metadati a livello di progetto e gli script di avvio vengono eseguiti solo quando è disponibile una rete. Questo documento descrive come usare gli script di avvio sulle istanze VM Linux. Per informazioni su come aggiungere uno script di avvio a livello di progetto, consulta gcloud compute project-info add-metadata.

Per gli script di avvio di Linux, puoi utilizzare un file bash o non-bash. Per utilizzare un file non bash, designa l'interprete aggiungendo #! all'inizio del file. Ad esempio, per utilizzare uno script di avvio Python 3, aggiungi #! /usr/bin/python3 all'inizio del file.

Se specifichi uno script di avvio utilizzando una delle procedure in questo documento, Compute Engine fa quanto segue:

  1. Copia lo script di avvio sulla VM

  2. Imposta le autorizzazioni di esecuzione sullo script di avvio

  3. Esegue lo script di avvio come utente root all'avvio della VM

Per informazioni sulle varie attività relative agli script di avvio e su quando eseguirle, consulta la Panoramica.

Prima di iniziare

  • Leggi la panoramica degli script di avvio.
  • Ulteriori informazioni sul server di metadati.
  • Se non l'hai già fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale viene verificata l'identità dell'utente per ottenere l'accesso ai servizi e alle API Google Cloud. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi eseguire l'autenticazione in Compute Engine come segue.

    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. Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

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

      Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, utilizzi le credenziali che fornisci a gcloud CLI.

        Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

        gcloud init

      Per maggiori informazioni, consulta Autenticazione per l'utilizzo di REST nella documentazione sull'autenticazione di Google Cloud.

Chiavi dei metadati per gli script di avvio di Linux

Uno script di avvio viene passato a una VM da una località specificata da una chiave di metadati. Una chiave di metadati specifica se lo script di avvio viene archiviato localmente, in Cloud Storage o passato direttamente alla VM. La chiave dei metadati che utilizzi potrebbe anche dipendere dalle dimensioni dello script di avvio.

La tabella seguente mostra le chiavi dei metadati che puoi utilizzare per gli script di avvio di Linux e fornisce informazioni sulla chiave da utilizzare in base alla località di archiviazione e alle dimensioni dello script di avvio.

Chiave dei metadati Da utilizzare per
startup-script Il passaggio di uno script di avvio bash o non bash archiviato localmente o aggiunto direttamente e delle dimensioni massime di 256 kB
startup-script-url Il passaggio di uno script di avvio bash o non bash archiviato in Cloud Storage e di dimensioni superiori a 256 kB. La stringa che inserisci qui viene utilizzata così com'è per eseguire gsutil. Se startup-script-url contiene spazi, non sostituire gli spazi con %20 e non aggiungere virgolette doppie ("") alla stringa startup-script-url.

Ordine di esecuzione degli script di avvio Linux

Puoi utilizzare più script di avvio. Gli script di avvio archiviati localmente o aggiunti vengono eseguiti direttamente prima degli script di avvio archiviati in Cloud Storage. In base alla chiave dei metadati, la tabella seguente mostra l'ordine di esecuzione degli script di avvio di Linux.

Chiave dei metadati Ordine di esecuzione
startup-script Prima di tutto, dopo ogni avvio
startup-script-url Il secondo durante ogni avvio dopo l'avvio iniziale

Passare direttamente uno script di avvio Linux

Puoi aggiungere i contenuti di uno script di avvio direttamente a una VM quando la crei. Le seguenti procedure mostrano come creare una VM con uno script di avvio che installa Apache e crea una pagina web di base.

Console

Passaggio di uno script di avvio Linux direttamente a una nuova VM

  1. Nella console Google Cloud, vai alla pagina Crea un'istanza.

    Vai a Crea un'istanza

  2. Per Disco di avvio, seleziona Cambia e seleziona un sistema operativo Linux.

  3. Espandi la sezione Opzioni avanzate e procedi nel seguente modo:

    1. Espandi la sezione Gestione.
    2. Nella sezione Automazione, aggiungi il seguente script di avvio:

       #! /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. Fai clic su Crea.

Passaggio di uno script di avvio Linux direttamente a una VM esistente

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Fai clic sul nome della VM.

  3. Fai clic su Modifica.

  4. In Automazione, aggiungi i contenuti dello script di avvio.

Verificare lo script di avvio

Dopo l'avvio della VM, visualizza l'IP esterno in un browser web per verificare che lo script di avvio abbia creato il sito web. Potrebbe essere necessario attendere circa un minuto prima che lo script di avvio di esempio venga completato.

gcloud

Passaggio di uno script di avvio Linux direttamente a una nuova VM

Passa i contenuti di uno script di avvio direttamente a una VM durante la sua creazione utilizzando il seguente 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'

Sostituisci VM_NAME con il nome della VM.

Passaggio di uno script di avvio Linux direttamente a una VM esistente

Aggiungi lo script di avvio direttamente a una VM esistente utilizzando il seguente 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'

Sostituisci quanto segue:

  • VM_NAME: il nome della VM

  • ZONE: la zona della VM

Verificare lo script di avvio

Dopo l'avvio della VM, visualizza l'IP esterno in un browser web per verificare che lo script di avvio abbia creato il sito web. Potrebbe essere necessario attendere circa un minuto prima che lo script di avvio di esempio venga completato.

REST

Passaggio di uno script di avvio Linux direttamente a una nuova VM

Passa i contenuti di uno script di avvio direttamente a una VM durante la sua creazione utilizzando il seguente metodo 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"
      }
    ]
  },
  ...
}

Sostituisci quanto segue:

  • PROJECT_ID: ID progetto

  • ZONE: la zona in cui creare la VM

Passaggio di uno script di avvio Linux direttamente a una VM esistente

  1. Ottieni il valore tags.fingerprint della VM utilizzando il metodo instances.get.

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

    Sostituisci quanto segue:

    • PROJECT_ID: ID progetto

    • ZONE: la zona della VM

    • VM_NAME: la zona della VM

  2. Passa lo script di avvio utilizzando il valore fingerprint, insieme alla chiave e al valore dei metadati per lo script di avvio, in una chiamata al metodo 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"
        }
      ],
      ...
    }
    

    Sostituisci quanto segue:

    • PROJECT_ID: ID progetto

    • ZONE: la zona della VM

    • VM_NAME: la zona della VM

    • FINGERPRINT: il valore tags.fingerprint ottenuto usando il metodo instances.get

Verificare lo script di avvio

Dopo l'avvio della VM, visualizza l'IP esterno in un browser web per verificare che lo script di avvio abbia creato il sito web. Potrebbe essere necessario attendere circa un minuto prima che lo script di avvio di esempio venga completato.

Passare uno script di avvio Linux da un file locale

Puoi archiviare uno script di avvio in un file locale sulla tua workstation e passare il file locale come metadati a una VM quando lo crei. Non puoi usare i file archiviati nelle VM come script di avvio.

Prima di passare uno script di avvio Linux da un file locale a una VM, segui questi passaggi:

  1. Crea un file locale in cui archiviare lo script di avvio.

  2. Osserva il percorso relativo tra gcloud CLI allo script di avvio.

  3. Aggiungi il seguente script di avvio al file:

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

Passare uno script di avvio Linux da un file locale a una nuova VM

Crea una VM e passa i contenuti di un file locale da utilizzare come script di avvio usando il comando gcloud compute instances create con il 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

Sostituisci quanto segue:

  • VM_NAME: il nome della VM

  • FILE_PATH: il percorso relativo del file di script di avvio

Passare uno script di avvio Linux da un file locale a una VM esistente

Passa uno script di avvio a una VM esistente da un file locale utilizzando il seguente comando gcloud compute instances add-metadata:

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

Sostituisci quanto segue:

  • VM_NAME: il nome della VM

  • ZONE: la zona della VM

  • FILE_PATH: il percorso relativo del file di script di avvio

Verificare lo script di avvio

Visualizza l'IP esterno in un browser web per verificare che lo script di avvio abbia creato il sito web. Potrebbe essere necessario attendere circa un minuto per il completamento dello script di avvio di esempio.

Passaggio di uno script di avvio Linux da Cloud Storage

Puoi archiviare uno script di avvio in Cloud Storage e passarlo a una VM al momento della creazione. Dopo aver aggiunto uno script di avvio a Cloud Storage, hai un URL che puoi utilizzare per fare riferimento allo script di avvio quando crei una VM.

Prima di aggiungere uno script di avvio da un bucket Cloud Storage, segui questi passaggi:

  1. Crea un file in cui archiviare lo script di avvio. Questo esempio utilizza un file bash (.sh).

  2. Aggiungi quanto segue al file bash, che installa Apache e crea una pagina web semplice:

    #! /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. Crea un bucket Cloud Storage.

  4. Aggiungi il file al bucket Cloud Storage.

Implicazioni per la sicurezza

  • Per impostazione predefinita, i proprietari e gli editor del progetto possono accedere ai file di Cloud Storage nello stesso progetto, a meno che non siano presenti controlli di accesso espliciti che non lo consentono.

  • Se il bucket o l'oggetto Cloud Storage è meno sicuro dei metadati, esiste un rischio di escalation dei privilegi se lo script di avvio viene modificato e la VM si riavvia. Questo perché, dopo il riavvio della VM, lo script di avvio viene eseguito come root e può quindi utilizzare le autorizzazioni dell'account di servizio collegato per accedere ad altre risorse.

Limitazioni

Console

Passaggio di uno script di avvio archiviato in Cloud Storage a una nuova VM

  1. Nella console Google Cloud, vai alla pagina Crea un'istanza.

    Vai a Crea un'istanza

  2. Specifica i dettagli della VM.

  3. Per Disco di avvio, seleziona Cambia e scegli un sistema operativo Linux.

  4. Nella sezione Identità e accesso API, seleziona un account di servizio con il ruolo Visualizzatore oggetti Storage (roles/storage.objectViewer).

  5. Espandi la sezione Opzioni avanzate e procedi nel seguente modo:

    1. Espandi la sezione Gestione.
    2. Nella sezione Metadati, aggiungi i valori per i seguenti elementi:

      • Chiave: la chiave dei metadati. Imposta su startup-script-url per aggiungere uno script di avvio da Cloud Storage.

      • Valore: il valore dei metadati. Imposta la posizione Cloud Storage del file di script di avvio utilizzando uno dei seguenti formati:

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

        Sostituisci quanto segue:

        • BUCKET: il nome del bucket che contiene il file dello script di avvio
        • FILE: il nome del file dello script di avvio
  6. Per creare la VM, fai clic su Crea.

Passaggio di uno script di avvio archiviato in Cloud Storage a una VM esistente

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Fai clic sul nome della VM.

  3. Fai clic su Modifica.

  4. In Metadati, aggiungi i seguenti valori:

    • Chiave: startup-script-url

    • Valore: il percorso Cloud Storage del file di script di avvio in uno dei seguenti formati:

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

Verificare lo script di avvio

Visualizza l'IP esterno in un browser web per verificare che lo script di avvio abbia creato il sito web. Potrebbe essere necessario attendere circa un minuto per il completamento dello script di avvio di esempio.

gcloud

Passaggio di uno script di avvio archiviato in Cloud Storage a una nuova VM

Passa uno script di avvio archiviato in Cloud Storage a una VM quando la crei utilizzando il seguente comando gcloud compute instances create. Per il valore del flag --scope, utilizza storage-ro in modo che la VM possa accedere a 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

Sostituisci quanto segue:

  • VM_NAME: il nome della VM.

  • CLOUD_STORAGE_URL: il valore dei metadati. Imposta il percorso Cloud Storage del file di script di avvio in uno dei seguenti formati:

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

Passaggio di uno script di avvio archiviato in Cloud Storage a una VM esistente

Passa uno script di avvio archiviato in Cloud Storage su una VM esistente utilizzando il seguente comando gcloud compute instances add-metadata:

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

Sostituisci quanto segue:

  • VM_NAME: il nome della VM.

  • ZONE: la zona della VM.

  • CLOUD_STORAGE_URL: il valore dei metadati. Imposta il percorso Cloud Storage del file di script di avvio in uno dei seguenti formati:

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

Verificare lo script di avvio

Visualizza l'IP esterno in un browser web per verificare che lo script di avvio abbia creato il sito web. Potrebbe essere necessario attendere circa un minuto per il completamento dello script di avvio di esempio.

REST

Passaggio di uno script di avvio archiviato in Cloud Storage a una nuova VM

Passa a una VM uno script di avvio archiviato in Cloud Storage quando la crei utilizzando il seguente metodo instances.insert. Al campo scopes, aggiungi https://www.googleapis.com/auth/devstorage.read_only in modo che la VM possa accedere a 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"
      }
    ]
  },
  ...
}

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto.

  • ZONE: la zona in cui creare la nuova VM.

  • CLOUD_STORAGE_URL: il valore dei metadati. Imposta il percorso Cloud Storage del file di script di avvio in uno dei seguenti formati:

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

Passaggio di uno script di avvio archiviato in Cloud Storage a una VM esistente

  1. Ottieni il valore tags.fingerprint della VM utilizzando il metodo instances.get.

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

    Sostituisci quanto segue:

    • PROJECT_ID: ID progetto

    • ZONE: la zona della VM

    • VM_NAME: la zona della VM

  2. Passa lo script di avvio utilizzando il valore fingerprint, insieme alla chiave e al valore dei metadati per lo script di avvio, in una chiamata al metodo 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"
        }
      ],
      ...
    }
    

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID progetto.

    • ZONE: la zona della VM.

    • VM_NAME: la zona della VM.

    • FINGERPRINT: il valore tags.fingerprint ottenuto utilizzando il metodo instances.get.

    • CLOUD_STORAGE_URL: il valore dei metadati. Imposta il percorso Cloud Storage del file dello script di avvio utilizzando uno dei seguenti formati:

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

Verificare lo script di avvio

Visualizza l'IP esterno in un browser web per verificare che lo script di avvio abbia creato il sito web. Potrebbe essere necessario attendere circa un minuto per il completamento dello script di avvio di esempio.

Accesso ai metadati da uno script di avvio di Linux

In uno script di avvio puoi accedere ai valori dei metadati. Ad esempio, puoi utilizzare lo stesso script per più VM e parametrizzare ogni script singolarmente passando valori di metadati diversi a ogni VM.

Per accedere a un valore di metadati personalizzato da uno script di avvio:

  1. Crea uno script di avvio che esegue una query sul valore di una chiave di metadati. Ad esempio, il seguente script di avvio del file bash (.sh) esegue query sul valore della chiave di metadati 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. Imposta il valore della chiave di metadati foo quando crei una VM utilizzando il seguente comando gcloud compute instances create. In questo esempio, lo script di avvio viene passato alla VM da un file locale.

    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
    

    Sostituisci quanto segue:

    • VM_NAME: il nome della VM

    • FILE_PATH: il percorso relativo del file di script di avvio

    Per ulteriori informazioni su come specificare una coppia chiave/valore di metadati, consulta Impostazione di metadati personalizzati.

  3. Dalla workstation locale, visualizza l'IP esterno in un browser web per verificare che lo script di avvio generi il valore foo. Potrebbe essere necessario attendere circa un minuto prima che lo script di avvio di esempio venga completato.

Nuova esecuzione di uno script di avvio Linux

Esegui di nuovo uno script di avvio procedendo nel seguente modo:

  1. Connessione alla VM.

  2. Esegui questo comando:

    sudo google_metadata_script_runner startup
    

Visualizzazione dell'output di uno script di avvio Linux

Puoi visualizzare l'output da uno script di avvio di Linux in uno dei seguenti modi:

Passaggi successivi