Utilizzo degli script di avvio nelle VM Linux


Uno script di avvio è un file che esegue attività durante la procedura di avvio di un'istanza di una macchina virtuale (VM). Gli script di avvio possono essere applicati a tutte le VM di 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 vengono eseguiti solo quando è disponibile una rete. Questo documento descrive come utilizzare 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 file bash o non bash. Per utilizzare un file non bash, designa l'interprete aggiungendo un #! nella parte superiore del file. Ad esempio, per utilizzare uno script di avvio Python 3, aggiungi #! /usr/bin/python3 nella parte superiore del file.

Se specifichi uno script di avvio utilizzando una delle procedure descritte in questo documento, Compute Engine esegue le seguenti operazioni:

  1. Copia lo script di avvio nella VM

  2. Imposta le autorizzazioni di esecuzione nello 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 eseguire ciascuna, consulta la Panoramica.

Prima di iniziare

  • Leggi la panoramica degli script di avvio.
  • Scopri di più sul server di metadati.
  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale la tua identità viene verificata per l'accesso a servizi e API. Google Cloud Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti in Compute Engine selezionando una delle seguenti opzioni:

    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

      Per utilizzare gli esempi dell'API REST in questa pagina in un ambiente di sviluppo locale, utilizza le credenziali fornite all'interfaccia alla 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.

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

      Chiavi dei metadati per gli script di avvio di Linux

      Uno script di avvio viene passato a una VM da una posizione specificata da una chiave di metadati. Una chiave dei metadati specifica se lo script di avvio è archiviato localmente, in Cloud Storage o passato direttamente alla VM. La chiave dei metadati utilizzata potrebbe dipendere anche 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 posizione e alle dimensioni dello script di avvio.

      Chiave dei metadati Utilizzo per
      startup-script Passare uno script di avvio bash o non bash archiviato localmente o aggiunto direttamente e di dimensioni massime pari a 256 KB
      startup-script-url Passare uno script di avvio bash o non bash archiviato in Cloud Storage e di dimensioni superiori a 256 KB. La stringa inserita qui viene utilizzata così com'è per eseguire gcloud storage. Se startup-script-url contiene caratteri di spazio, non sostituire gli spazi con %20 o aggiungere virgolette doppie ("") alla stringa startup-script-url.

      Ordine di esecuzione degli script di avvio di Linux

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

      Chiave dei metadati Ordine di esecuzione
      startup-script Per la prima volta durante ogni avvio dopo l'avvio iniziale
      startup-script-url 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 procedure riportate di seguito mostrano come creare una VM con uno script di avvio che installa Apache e crea una pagina web di base.

      Console

      Passare 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 utilizzare un sistema operativo Linux:

        1. Nel menu di navigazione, fai clic su Sistema operativo e spazio di archiviazione.

        2. Fai clic su Cambia.

        3. Nel riquadro Disco di avvio visualizzato, seleziona un sistema operativo Linux.

      3. Per aggiungere direttamente uno script di avvio Linux:

        1. Nel menu di navigazione, fai clic su Avanzate.

        2. Nella sezione Automazione, inserisci quanto segue nel campo Script di avvio:

          #! /bin/bash
          apt update
          apt -y install apache2
          cat < /var/www/html/index.html
          

          Linux startup script added directly.

          EOF
      4. (Facoltativo) Specifica altre opzioni di configurazione. Per ulteriori informazioni, consulta Opzioni di configurazione durante la creazione dell'istanza.

      5. Per creare e avviare l'istanza, fai clic su Crea.

      Passare uno script di avvio Linux direttamente a una VM esistente

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

        Vai a Istanze VM

      2. Fai clic sul nome dell'istanza.

      3. Fai clic su Modifica.

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

      Verifica dello script di avvio

      Dopo l'avvio dell'istanza, visualizza l'IP esterno in un browser web per verificare che lo script di avvio abbia creato il sito web. Potresti dover attendere circa 1 minuto per il completamento dello script di avvio di esempio.

      gcloud

      Passare uno script di avvio Linux direttamente a una nuova VM

      Passa i contenuti di uno script di avvio direttamente a una VM durante la 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 < /var/www/html/index.html
        

      Linux startup script added directly.

      EOF'

      Sostituisci VM_NAME con il nome della VM.

      Passare uno script di avvio Linux direttamente a una VM esistente

      Aggiungi lo script di avvio direttamente a una VM esistente utilizzando il seguente 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 < /var/www/html/index.html
          

      Linux startup script added directly.

      EOF'

      Sostituisci quanto segue:

      • VM_NAME: il nome della VM

      • ZONE: la zona della VM

      Verifica dello 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. Potresti dover attendere circa 1 minuto per il completamento dello script di avvio di esempio.

      REST

      Passare uno script di avvio Linux direttamente a una nuova VM

      Passa i contenuti di uno script di avvio direttamente a una VM durante la creazione utilizzando il seguente instances.insert metodo.

      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 < /var/www/html/index.html\n

      Linux startup script added directly.

      \nEOF" } ] }, ... }

      Sostituisci quanto segue:

      • PROJECT_ID: l'ID del progetto in cui esiste la VM.

      • ZONE: la zona in cui creare la VM.

      Passare uno script di avvio Linux direttamente a una VM esistente

      1. Ottieni il valore metadata.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: l'ID del progetto in cui esiste la VM.

        • ZONE: la zona della VM.

        • VM_NAME: il nome 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 < /var/www/html/index.html\n

        Linux startup script added directly.

        \nEOF" } ], ... }

        Sostituisci quanto segue:

        • PROJECT_ID: l'ID del progetto in cui esiste la VM.

        • ZONE: la zona della VM.

        • VM_NAME: il nome della VM.

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

      Verifica dello 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. Potresti dover attendere circa 1 minuto per il completamento dello script di avvio di esempio.

      Trasmissione di uno script di avvio di 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 la crei. Non puoi utilizzare i file archiviati nelle VM come script di avvio.

      Prima di passare uno script di avvio Linux da un file locale a una VM, svolgi i seguenti passaggi:

      1. Crea un file locale per archiviare lo script di avvio.

      2. Prendi nota del percorso relativo dallgcloud CLI allo script di avvio.

      3. Aggiungi il seguente script di avvio al file:

        #! /bin/bash
        apt update
        apt -y install apache2
        cat < /var/www/html/index.html
        

        Linux startup script from a local file.

        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 utilizzando 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 al file 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 gcloud compute instances add-metadata comando:

      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 al file script di avvio

      Verifica dello script di avvio

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

      Trasmissione 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 la procedura riportata di seguito:

      1. Crea un file per 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 semplice pagina web:

        #! /bin/bash
        apt update
        apt -y install apache2
        cat < /var/www/html/index.html
        

        Linux startup script from Cloud Storage.

        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 dei progetti possono accedere ai file di Cloud Storage nello stesso progetto, a meno che non siano presenti controlli di accesso espliciti che lo impediscano.

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

    Limitazioni

    Console

    Passare 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. Per utilizzare un sistema operativo Linux:

      1. Nel menu di navigazione, fai clic su Sistema operativo e spazio di archiviazione.

      2. Nella sezione Sistema operativo e spazio di archiviazione, fai clic su Cambia. Quindi, seleziona un sistema operativo Linux.

    3. Per consentire all'istanza di accedere al bucket Cloud Storage che contiene lo script di avvio di Linux, procedi nel seguente modo:

      1. Nel menu di navigazione, fai clic su Sicurezza.

      2. Nell'elenco Account di servizio, seleziona un account di servizio con il ruolo IAM Visualizzatore oggetti Storage (roles/storage.objectViewer) nel bucket Cloud Storage.

    4. Per aggiungere uno script di avvio di Linux specificando un file in Cloud Storage, procedi nel seguente modo:

      1. Nel menu di navigazione, fai clic su Avanzate.

      2. Nella sezione Metadati, fai clic su Aggiungi elemento. Vengono visualizzati i campi Chiave e Valore.

      3. Nel campo Key (Chiave), inserisci startup-script-url.

      4. Nel campo Valore, inserisci la posizione in Cloud Storage del file dello script di avvio utilizzando uno dei seguenti formati:

        • URL autenticato: https://storage.googleapis.com/BUCKET/FILE
        • URI gcloud storage: 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

    5. (Facoltativo) Specifica altre opzioni di configurazione. Per ulteriori informazioni, consulta Opzioni di configurazione durante la creazione dell'istanza.

    6. Per creare e avviare l'istanza, fai clic su Crea.

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

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

      Vai a Istanze VM

    2. Fai clic sul nome dell'istanza.

    3. Fai clic su Modifica.

    4. In Metadati, aggiungi i seguenti valori:

      • Chiave: startup-script-url

      • Valore: la posizione in Cloud Storage del file dello script di avvio utilizzando uno dei seguenti formati:

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

    Verifica dello 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 1 minuto per il completamento dello script di avvio di esempio.

    gcloud

    Passare 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. Impostato sulla posizione del file dello script di avvio in Cloud Storage utilizzando uno dei seguenti formati:

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

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

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

    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. Impostato sul percorso in Cloud Storage del file dello script di avvio utilizzando uno dei seguenti formati:

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

    Verifica dello 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 1 minuto per il completamento dello script di avvio di esempio.

    REST

    Passare 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 metodo instances.insert. Nel 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 VM.

    • CLOUD_STORAGE_URL: il valore dei metadati. Impostato sulla posizione del file dello script di avvio in Cloud Storage utilizzando uno dei seguenti formati:

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

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

    1. Ottieni il valore metadata.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: l'ID progetto

      • ZONE: la zona della VM

      • VM_NAME: il nome 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: il nome della VM.

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

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

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

    Verifica dello 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 1 minuto per il completamento dello script di avvio di esempio.

    Accesso ai metadati da uno script di avvio 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 dei metadati personalizzato da uno script di avvio:

    1. Crea uno script di avvio che esegue una query sul valore di una chiave dei metadati. Ad esempio, il seguente script di avvio del file bash (.sh) esegue una query sul valore della chiave dei 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 < /var/www/html/index.html
      

      Accessing metadata value of foo: $METADATA_VALUE

      EOF
    2. Imposta il valore della chiave dei metadati foo durante la creazione di una VM utilizzando il seguente gcloud compute instances create comando. Per 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 al file script di avvio

      Per saperne di più su come specificare una coppia chiave/valore dei metadati, consulta Impostare i metadati personalizzati.

    3. Dalla tua workstation locale, visualizza l'IP esterno in un browser web per verificare che lo script di avvio restituisca il valore foo. Potresti dover attendere circa 1 minuto per il completamento dello script di avvio di esempio.

    Riavviare uno script di avvio di Linux

    Per eseguire nuovamente uno script di avvio:

    1. Connessione alla VM.

    2. Esegui il seguente comando:

      sudo google_metadata_script_runner startup

    Visualizzazione dell'output di uno script di avvio Linux

    Puoi visualizzare l'output di uno script di avvio Linux eseguendo una delle seguenti operazioni:

    Passaggi successivi