Startskripts auf Linux-VMs verwenden


Ein Startskript ist eine Datei, die während des Startvorgangs einer VM-Instanz Aufgaben ausführt. Startskripts können für alle VMs in einem Projekt oder für eine einzelne VM gelten. Durch Metadaten auf VM-Ebene angegebene Startskripts überschreiben von Metadaten auf Projektebene angegebene Startskripts. Startskripts werden nur ausgeführt, wenn ein Netzwerk verfügbar ist. In diesem Dokument wird beschrieben, wie Startskripts für Linux-VM-Instanzen verwendet werden. Informationen zum Hinzufügen eines Startskripts auf Projektebene finden Sie unter gcloud compute project-info add-metadata.

Für Linux-Startskripts können Sie Bash oder Nicht-Bash-Dateien verwenden. Wenn Sie eine Nicht-Bash-Datei verwenden möchten, geben Sie den Interpreter durch Hinzufügen eines #! oben in der Datei an. Wenn Sie beispielsweise ein Python 3-Startskript verwenden möchten, fügen Sie oben in der Datei #! /usr/bin/python3 ein.

Wenn Sie mit einem der Verfahren in diesem Dokument ein Startskript angeben, führt Compute Engine folgende Schritte aus:

  1. Kopiert das Startskript auf die VM

  2. Legt die Ausführungsberechtigungen für das Startskript fest

  3. Führt das Startskript als root-Nutzer aus, wenn die VM bootet

Informationen zu den verschiedenen Aufgaben in Bezug auf Startskripts und wann die Ausführung der jeweiligen Aufgaben stattfinden soll finden Sie in der Übersicht.

Hinweise

  • Lesen Sie die Übersicht über Startskripts.
  • Metadatenserverinformationen
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich wie folgt bei Compute Engine authentifizieren.

    Wählen Sie den Tab für die Verwendung der Beispiele auf dieser Seite aus:

    Console

    Wenn Sie über die Google Cloud Console auf Google Cloud-Dienste und -APIs zugreifen, müssen Sie die Authentifizierung nicht einrichten.

    gcloud

    1. Installieren Sie die Google Cloud CLI und initialisieren Sie sie mit folgendem Befehl:

      gcloud init
    2. Legen Sie eine Standardregion und -zone fest.

    REST

    Verwenden Sie die von der gcloud CLI bereitgestellten Anmeldedaten, um die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung zu verwenden.

      Installieren Sie die Google Cloud CLI und initialisieren Sie sie mit folgendem Befehl:

      gcloud init

Metadatenschlüssel für Linux-Startskripts

Ein Startskript wird von einem durch einen Metadatenschlüssel angegebenen Speicherort an eine VM übergeben. Ein Metadatenschlüssel gibt an, ob das Startskript lokal, in Cloud Storage gespeichert oder direkt an die VM übergeben wird. Der verwendete Metadatenschlüssel kann auch von der Größe des Startskripts abhängen.

Die folgende Tabelle enthält die Metadatenschlüssel, die Sie für Linux-Startskripts verwenden können. Außerdem finden Sie Informationen dazu, welcher Schlüssel basierend auf dem Speicherort und der Größe des Startskripts verwendet werden sollte.

Metadatenschlüssel Nutzen für
startup-script Übergabe eines Bash- oder Nicht-Bash-Startskripts, das lokal gespeichert oder direkt hinzugefügt wird und bis zu 256 KB groß ist
startup-script-url Übergabe eines Bash- oder Nicht-Bash-Startskripts, das in Cloud Storage gespeichert ist und größer als 256 KB groß ist. Der hier eingegebene String wird unverändert ausgeführt, um gsutil auszuführen. Wenn Ihre startup-script-url Leerzeichen enthält, ersetzen Sie die Leerzeichen nicht durch %20 und fügen Sie dem String startup-script-url keine doppelten Anführungszeichen ("") hinzu.

Reihenfolge der Ausführung von Linux-Startskripts

Sie können mehrere Startskripts verwenden. Startskripts oder direkt hinzugefügte Startskripts werden vor in Cloud Storage gespeicherten Startskripts ausgeführt. Die folgende Tabelle zeigt auf der Grundlage des Metadatenschlüssels die Reihenfolge der Ausführung von Linux-Startskripts.

Metadatenschlüssel Ausführungsreihenfolg
startup-script Als Erstes bei jedem Start nach dem ersten Start
startup-script-url Als Zweites während jedem Start nach dem ersten Start

Linux-Startskript direkt übergeben

Sie können den Inhalt eines Startskripts beim Erstellen einer VM direkt einer VM hinzufügen. Die folgenden Verfahren zeigen, wie Sie eine VM mit einem Startskript erstellen, das Apache installiert und eine einfache Webseite erstellt.

Console

Linux-Startskript direkt an eine neue VM übergeben

  1. Rufen Sie in der Google Cloud Console die Seite Instanz erstellen auf.

    Zur Seite „Instanz erstellen“

  2. Wählen Sie für Bootlaufwerk die Option Ändern und dann ein Linux-Betriebssystem aus.

  3. Maximieren Sie den Abschnitt Erweiterte Optionen und tun Sie Folgendes:

    1. Maximieren Sie den Bereich Verwaltung.
    2. Fügen Sie im Abschnitt Automatisierung folgendes Startskript hinzu:

       #! /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. Klicken Sie auf Erstellen.

Linux-Startskript direkt an eine vorhandene VM übergeben

  1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zu Seite „VM-Instanzen“

  2. Klicken Sie auf den Namen der VM.

  3. Klicken Sie auf Bearbeiten.

  4. Fügen Sie unter Automatisierung den Inhalt Ihres Startskripts hinzu.

Startskript überprüfen

Rufen Sie nach dem Start der VM die externe IP-Adresse in einem Webbrowser auf, um zu prüfen, ob die Website vom Startskript erstellt wurde. Möglicherweise müssen Sie etwa eine Minute warten, bis das Beispiel-Startskript ausgeführt wurde.

gcloud

Linux-Startskript direkt an eine neue VM übergeben

Übergeben Sie den Inhalt eines Startskripts beim Erstellen von diesem mit dem folgenden gcloud compute instances create-Befehl direkt an eine VM.

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'

Ersetzen Sie VM_NAME durch den Namen der VM.

Linux-Startskript direkt an eine vorhandene VM übergeben

Fügen Sie das Startskript mit dem folgenden gcloud compute instances add-metadata-Befehl direkt einer vorhandenen VM hinzu:

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'

Dabei gilt:

  • VM_NAME: der Name der VM

  • ZONE: Zone der VM

Startskript überprüfen

Rufen Sie nach dem Start der VM die externe IP-Adresse in einem Webbrowser auf, um zu prüfen, ob die Website vom Startskript erstellt wurde. Möglicherweise müssen Sie etwa eine Minute warten, bis das Beispiel-Startskript ausgeführt wurde.

REST

Linux-Startskript direkt an eine neue VM übergeben

Übergeben Sie den Inhalt eines Startskripts direkt an die VM, wenn Sie es erstellen, mit der folgenden instances.insert-Methode.

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"
      }
    ]
  },
  ...
}

Dabei gilt:

  • PROJECT_ID: die Projekt-ID

  • ZONE ist die Zone, in der die VM erstellt werden soll.

Linux-Startskript direkt an eine vorhandene VM übergeben

  1. Rufen Sie den Wert tags.fingerprint der VM mit der Methode instances.get ab.

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

    Dabei gilt:

    • PROJECT_ID: die Projekt-ID

    • ZONE: Zone der VM

    • VM_NAME: die Zone der VM

  2. Übergeben Sie das Startskript mithilfe des Werts fingerprint zusammen mit dem Metadatenschlüssel und dem Wert für das Startskript in einem Aufruf der Methode 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"
        }
      ],
      ...
    }
    

    Dabei gilt:

    • PROJECT_ID: die Projekt-ID

    • ZONE: Zone der VM

    • VM_NAME: die Zone der VM

    • FINGERPRINT: Der Wert für tags.fingerprint, der mit der Methode instances.get abgerufen wurde

Startskript überprüfen

Rufen Sie nach dem Start der VM die externe IP-Adresse in einem Webbrowser auf, um zu prüfen, ob die Website vom Startskript erstellt wurde. Möglicherweise müssen Sie etwa eine Minute warten, bis das Beispiel-Startskript ausgeführt wurde.

Linux-Startskript aus einer lokalen Datei übergeben

Sie können ein Startskript in einer lokalen Datei auf Ihrer Workstation speichern und die lokale Datei beim Erstellen als Metadaten an eine VM übergeben. Auf VMs gespeicherte Dateien können nicht als Startskripts verwendet werden.

Bevor Sie ein Linux-Startskript von einer lokalen Datei an eine VM übergeben, gehen Sie so vor:

  1. Erstellen Sie eine lokale Datei zum Speichern des Startskripts.

  2. Notieren Sie sich den relativen Pfad von der gcloud CLI zum Startskript.

  3. Fügen Sie der Datei das folgende Startskript hinzu:

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

Linux-Startskript aus einer lokalen Datei an eine neue VM übergeben

Erstellen Sie eine VM und übergeben Sie den Inhalt einer lokalen Datei, die als Startskript verwendet werden soll. Verwenden Sie dazu den Befehl gcloud compute instances create mit dem 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

Dabei gilt:

  • VM_NAME: Der Name der VM

  • FILE_PATH: der relative Pfad zur Startskriptdatei

Linux-Startskript aus einer lokalen Datei an eine vorhandene VM übergeben

Übergeben Sie ein Startskript mit dem folgenden gcloud compute instances add-metadata-Befehl von einer lokalen Datei an eine vorhandene VM:

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

Dabei gilt:

  • VM_NAME: der Name der VM

  • ZONE: Zone der VM

  • FILE_PATH: der relative Pfad zur Startskriptdatei

Startskript überprüfen

Rufen Sie die externe IP-Adresse in einem Webbrowser auf, um zu prüfen, ob das Startskript die Website erstellt hat. Möglicherweise müssen Sie etwa eine Minute warten, bis das Beispiel-Startskript ausgeführt wurde.

Linux-Startskript aus Cloud Storage übergeben

Sie können ein Startskript in Cloud Storage speichern und es beim Erstellen an eine VM übergeben. Nachdem Sie Cloud Storage ein Startskript hinzugefügt haben, haben Sie eine URL, mit der Sie beim Erstellen einer VM auf das Startskript verweisen können.

Führen Sie die folgenden Schritte aus, bevor Sie ein Startskript aus einem Cloud Storage-Bucket hinzufügen:

  1. Erstellen Sie eine Datei, in der das Startskript gespeichert wird. In diesem Beispiel wird eine Bash-Datei (.sh) verwendet.

  2. Fügen Sie Folgendes zur Bash-Datei hinzu, die Apache installiert und eine einfache Webseite erstellt:

    #! /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. Cloud Storage-Bucket erstellen

  4. Laden Sie die Datei in den Cloud Storage-Bucket hoch.

Auswirkungen auf die Sicherheit

  • Standardmäßig können Projektinhaber und Projektbearbeiter auf Cloud Storage-Dateien im selben Projekt zugreifen, außer es gibt explizite Zugriffssteuerungen, die dies verhindern.

  • Wenn der Cloud Storage-Bucket oder das Cloud Storage-Objekt weniger sicher ist als Metadaten, besteht ein Risiko der Rechteausweitung, wenn das Startskript geändert wird und die VM neu gestartet wird. Dies liegt daran, dass das Startskript nach dem Neustart der VM als root ausgeführt wird und dann mit den Berechtigungen des angehängten Dienstkontos auf andere Ressourcen zugreifen kann.

Beschränkungen

Console

In Cloud Storage gespeichertes Startskript an eine neue VM übergeben

  1. Rufen Sie in der Google Cloud Console die Seite Instanz erstellen auf.

    Zur Seite „Instanz erstellen“

  2. Geben Sie die VM-Details an.

  3. Wählen Sie für Bootlaufwerk die Option Ändern und dann ein Linux-Betriebssystem aus.

  4. Wählen Sie im Abschnitt Identität und API-Zugriff ein Dienstkonto mit der Rolle Storage-Objekt-Betrachter (roles/storage.objectViewer) aus.

  5. Maximieren Sie den Abschnitt Erweiterte Optionen und gehen Sie dann so vor:

    1. Maximieren Sie den Bereich Verwaltung.
    2. Fügen Sie im Abschnitt Metadaten Werte für Folgendes hinzu:

      • Key (Schlüssel): Metadatenschlüssel Legen Sie dafür startup-script-url fest, um ein Startskript aus Cloud Storage hinzuzufügen.

      • Wert: Der Metadatenwert. Legen Sie dafür den Cloud Storage-Speicherort der Startskriptdatei in einem der folgenden Formate fest:

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

        Dabei gilt:

        • BUCKET ist der Name des Buckets, der die Startskriptdatei enthält.
        • FILE: Der Name der Startskriptdatei.
  6. Klicken Sie auf Erstellen, um die VM zu erstellen.

In Cloud Storage gespeichertes Startskript an eine vorhandene VM übergeben

  1. Öffnen Sie in der Google Cloud Console die Seite VM-Instanzen.

    Zu Seite „VM-Instanzen“

  2. Klicken Sie auf den Namen der VM.

  3. Klicken Sie auf Bearbeiten.

  4. Fügen Sie unter Metadaten die folgenden Werte hinzu:

    • Key: startup-script-url

    • Wert: Der Cloud Storage-Speicherort der Startskriptdatei in einem der folgenden Formate:

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

Startskript überprüfen

Rufen Sie die externe IP-Adresse in einem Webbrowser auf, um zu prüfen, ob das Startskript die Website erstellt hat. Möglicherweise müssen Sie etwa eine Minute warten, bis das Beispiel-Startskript ausgeführt wurde.

gcloud

In Cloud Storage gespeichertes Startskript an eine neue VM übergeben

Übergeben Sie ein in Cloud Storage gespeichertes Startskript an eine VM, wenn Sie es mit dem folgenden gcloud compute instances create-Befehl erstellen. Verwenden Sie für den Wert des Flags --scope storage-ro, damit die VM auf Cloud Storage zugreifen kann.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --scopes=storage-ro \
  --metadata=startup-script-url=CLOUD_STORAGE_URL

Dabei gilt:

  • VM_NAME: der Name der VM.

  • CLOUD_STORAGE_URL: der Metadatenwert. Legen Sie dafür den Cloud Storage-Speicherort der Startskriptdatei in einem der folgenden Formate fest:

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

In Cloud Storage gespeichertes Startskript an eine vorhandene VM übergeben

Übergeben Sie ein Startskript, das in Cloud Storage gespeichert ist, mit dem folgenden gcloud compute instances add-metadata-Befehl an eine vorhandene VM:

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

Dabei gilt:

  • VM_NAME ist der Name der VM.

  • ZONE: Zone der VM.

  • CLOUD_STORAGE_URL: der Metadatenwert. Legen Sie dafür den Cloud Storage-Speicherort der Startskriptdatei in einem der folgenden Formate fest:

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

Startskript überprüfen

Rufen Sie die externe IP-Adresse in einem Webbrowser auf, um zu prüfen, ob das Startskript die Website erstellt hat. Möglicherweise müssen Sie etwa eine Minute warten, bis das Beispiel-Startskript ausgeführt wurde.

REST

In Cloud Storage gespeichertes Startskript an eine neue VM übergeben

Geben Sie das Startskript, das in Cloud Storage gespeichert ist, beim Erstellen an eine VM weiter, indem Sie die folgende instances.insert-Methode verwenden: Fügen Sie dem Feld scopes den Wert https://www.googleapis.com/auth/devstorage.read_only hinzu, damit die VM auf Cloud Storage zugreifen kann.

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"
      }
    ]
  },
  ...
}

Dabei gilt:

  • PROJECT_ID: die Projekt-ID.

  • ZONE ist die Zone, in der die neue VM erstellt werden soll.

  • CLOUD_STORAGE_URL: der Metadatenwert. Legen Sie dafür den Cloud Storage-Speicherort der Startskriptdatei in einem der folgenden Formate fest:

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

In Cloud Storage gespeichertes Startskript an eine vorhandene VM übergeben

  1. Rufen Sie den Wert tags.fingerprint der VM mit der Methode instances.get ab.

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

    Dabei gilt:

    • PROJECT_ID: die Projekt-ID

    • ZONE: Zone der VM

    • VM_NAME: die Zone der VM

  2. Übergeben Sie das Startskript mithilfe des Werts fingerprint zusammen mit dem Metadatenschlüssel und dem Wert für das Startskript in einem Aufruf der Methode 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"
        }
      ],
      ...
    }
    

    Dabei gilt:

    • PROJECT_ID: die Projekt-ID.

    • ZONE: Zone der VM.

    • VM_NAME: Die Zone der VM.

    • FINGERPRINT: Der mit der Methode instances.get abgerufene Wert tags.fingerprint.

    • CLOUD_STORAGE_URL: der Metadatenwert. Legen Sie dafür den Cloud Storage-Speicherort der Startskriptdatei in einem der folgenden Formate fest:

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

Startskript überprüfen

Rufen Sie die externe IP-Adresse in einem Webbrowser auf, um zu prüfen, ob das Startskript die Website erstellt hat. Möglicherweise müssen Sie etwa eine Minute warten, bis das Beispiel-Startskript ausgeführt wurde.

Auf Metadaten aus einem Linux-Startskript zugreifen

In einem Startskript können Sie auf Metadatenwerte zugreifen. Sie können beispielsweise dasselbe Skript für mehrere VMs verwenden und jedes Skript einzeln parametrisieren. Dazu übergeben Sie verschiedene Metadatenwerte an jede VM.

So greifen Sie auf einen benutzerdefinierten Metadatenwert von einem Startskript zu:

  1. Erstellen Sie ein Startskript, das den Wert eines Metadatenschlüssels abfragt. Das folgende Bash-Datei-Startskript (.sh) fragt beispielsweise den Wert des Metadatenschlüssels foo ab.

    #! /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. Legen Sie den Wert des Metadatenschlüssels foo beim Erstellen einer VM mit dem folgenden gcloud compute instances create-Befehl fest. In diesem Beispiel wird das Startskript von einer lokalen Datei an die VM übergeben.

    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
    

    Dabei gilt:

    • VM_NAME: Der Name der VM

    • FILE_PATH: der relative Pfad zur Startskriptdatei

    Weitere Informationen zum Angeben eines Metadaten-Schlüssel/Wert-Paars finden Sie unter Benutzerdefinierte Metadaten festlegen.

  3. Rufen Sie von Ihrer lokalen Workstation aus die externe IP-Adresse in einem Webbrowser auf, um zu prüfen, ob das Startskript den Wert von foo ausgibt. Möglicherweise müssen Sie etwa eine Minute warten, bis das Beispiel-Startskript ausgeführt wurde.

Linux-Startskript noch einmal ausführen

Führen Sie das Startskript so aus:

  1. Verbindung zur VM herstellen.

  2. Führen Sie folgenden Befehl aus:

    sudo google_metadata_script_runner startup
    

Ausgabe eines Linux-Startskripts ansehen

Sie können die Ausgabe eines Linux-Startskripts aufrufen, indem Sie eines der folgenden Dinge tun:

Nächste Schritte