Startskripts ausführen


Mit Compute Engine können Sie eigene Startskripts auf Ihren VM-Instanzen erstellen und ausführen, damit bei jedem Start der Instanzen automatisch bestimmte Aufgaben erledigt werden. Mit Startskripts können Sie beispielsweise Software installieren, Aktualisierungen durchführen, Dienste aktivieren und andere im Skript definierte Aufgaben ausführen.

Ein Startskript zum Installieren und Starten eines Apache-Servers könnte etwa so aussehen:

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

Ein Startskript geben Sie über den Metadatenserver mithilfe von Metadatenschlüsseln für Startskripts an. Verwenden Sie die Google Cloud Console, das gcloud-Befehlszeilentool oder die Compute Engine API, um ein Startskript bereitzustellen.

Vorbereitung

Erforderliche Berechtigungen für diese Aufgabe

Zum Ausführen dieser Aufgabe benötigen Sie die folgende Berechtigung:

Startskript ausführen

Wenn das Netzwerk verfügbar ist, führt die VM immer so Startskripts aus:

  • Für Linux-VMs mit dem Nutzer root.
  • Für Windows-VMs mit dem Konto System.

Ein Startskript kann verschiedene Dateitypen haben. Wenn ein Startskript vorhanden ist, führt Compute Engine folgende Schritte aus:

  1. Kopieren des Startskripts in eine lokale Datei auf der Instanz
  2. Festlegen von Berechtigungen für die Datei
  3. Ausführen der Datei

Sie können zum Beispiel ein Python-Skript statt eines Bash-Skripts verwenden. Aber denken Sie daran, dass Compute Engine das Skript so ausführt, wie es ist. Dabei kommt es nicht auf die Art des Skripts an.

Wenn Sie ein Skript ausführen möchten, das nicht in Bash geschrieben ist, müssen Sie eine Shebang-Zeile (eine Zeile, die mit #! beginnt) zu Beginn der Datei hinzufügen Damit wird dem Betriebssystem mitgeteilt, welcher Interpreter verwendet werden muss. Wenn Sie beispielsweise ein Python-Skript verwenden, können Sie die folgende Shebang-Zeile hinzufügen:

#! /usr/bin/python

Lokales Startskript verwenden

Ein lokales Startskript ist ein Skript, das sich auf Ihrem lokalen Computer befindet. Um ein lokales Startskript zu verwenden, übergeben Sie eine lokale Startskriptdatei an die Instanz oder stellen den Inhalt eines Startskripts direkt dem Metadatenserver zur Verfügung. Die Beispiele in den folgenden Unterabschnitten zeigen, wie Startskriptmetadaten aus einer lokalen Datei oder durch direkte Eingabe hinzugefügt werden.

Für lokale Startskripts gilt eine Längenbeschränkung von 256 KB für Metadatenwerte. Wenn Ihr Startskript dieses Limit überschreitet, können Sie es nicht lokal laden. Speichern Sie Ihre Datei stattdessen in Cloud Storage und geben Sie die Skript-URL beim Erstellen der Instanz an. Weitere Informationen dazu finden Sie unter Ein in Cloud Storage gespeichertes Startskript zur Verfügung stellen.

Startskriptdatei zur Verfügung stellen

Sie können eine lokale Startskriptdatei nur mit dem gcloud-Befehlszeilentool übergeben. Fügen Sie das Flag --metadata-from-file gefolgt von einem Metadatenschlüsselpaar startup-script=PATH_TO_FILE ein, wobei Sie PATH_TO_FILE durch einen relativen Pfad zum Startskript ersetzen:

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

Inhalt eines Startskripts direkt zur Verfügung stellen

Sie können auch die Google Cloud Console, das gcloud-Befehlszeilentool oder die Compute Engine API verwenden, um den Inhalt Ihres Startskripts direkt einzugeben oder einzufügen.

Console

Geben Sie in der Cloud Console im Bereich Startskript ein Startskript an:

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

    Zu „VM-Instanzen“

  2. Klicken Sie auf Instanz erstellen.
  3. Geben Sie auf der Seite Neue Instanz erstellen die Attribute für Ihre Instanz ein. Maximieren Sie für weitere Konfigurationsoptionen den Abschnitt Verwaltung, Sicherheit, Laufwerke, Netzwerk, einzelne Mandanten.
  4. Geben Sie im Bereich Automatisierung unter Startskript den Inhalt Ihres Startskripts an.

    Startskript in der Cloud Console einrichten

  5. Klicken Sie auf Erstellen, um die Instanz anzulegen.

gcloud

Verwenden Sie im gcloud-Befehlszeilentool das Flag --metadata, um den Inhalt Ihres Startskripts mithilfe des Schlüssel/Wert-Paars startup-script=contents anzugeben. Ersetzen Sie dabei contents durch den Inhalt Ihres Startskripts.

Mit dem folgenden Befehl erstellen Sie beispielsweise eine Instanz, die beim Start einige Systemaktualisierungen ausführt, Apache installiert und eine einzelne Webseite startet. Sie können diesen Befehl ausführen und dann die externe IP-Adresse der Instanz aufrufen, um den Inhalt der Seite index.html anzeigen zu lassen.

Führen Sie auf einem Linux-Desktop den Befehl so aus:

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

Wenn Sie sich auf einem Windows-Desktop befinden, können Sie diesen Befehl auf einem cmd-Terminal ausführen:

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

Wenn Sie PowerShell verwenden, können Sie diesen Befehl in ähnlicher Weise ausführen. Verwenden Sie dafür das Sonderzeichen Parsen unterbrechen (--%), um einen genauen Befehl an das gcloud-Tool zu übergeben.

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

API

Geben Sie in der API ein Startskript als Teil des Metadatenattributs in Ihrer Anfrage an und verwenden Sie startup-script als Metadatenschlüssel:

POST https://compute.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 update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><h1>Hello World</h1>\n<p>This page was created from a start up script.</p>\n</body></html>"
      }
    ]
  }
  ...
}

Ein Startskript für Windows-Instanzen zur Verfügung stellen

Auf Windows-Instanzen können Sie Startskripts mithilfe besonderer Metadatenschlüssel für Windows ausführen. Wählen Sie einen der speziellen Metadatenschlüssel aus der folgenden Tabelle aus. Jeder Metadatenschlüssel muss mit dem Skripttyp übereinstimmen, den Sie ausführen möchten. Sie können auch mehrere Startskripts verwenden. Dazu übergeben Sie der Instanz verschiedene Metadatenschlüssel. Sie können jeden Metadatenschlüssel für jede VM-Instanz nur einmal angeben.

Wenn Sie die Startskripte auf einer VM-Instanz nach dem Start der VM-Instanz manuell ausführen müssen, kann ein Administrator dies mit dem folgenden Befehl tun:

C:\Program Files\Google\Compute Engine\metadata_scripts\run_startup_scripts.cmd

In der folgenden Tabelle sehen Sie, welche Arten von Startskripts unterstützt werden, wann sie ausgeführt werden und mit welchem Metadatenschlüssel das Skript angegeben wird. Informationen zur Verwendung dieser Metadatenschlüssel finden Sie unter Lokales Startskript verwenden. Beachten Sie, dass diese Skripts nur ausgeführt werden, wenn Sie Ihr Image mit dem Befehl GCESysprep vorbereiten.

Skriptart Ausführungen:
  • Während GCESysprep2
  • Vor dem Start
Ausführungen:
  • Nach Abschluss von GCESysprep2
  • Bei jedem weiteren Start
url-Startskripts Metadatenschlüssel:
sysprep-specialize-script-url
Metadatenschlüssel:
windows-startup-script-url
cmd-Startskripts Metadatenschlüssel:
sysprep-specialize-script-cmd
Metadatenschlüssel:
windows-startup-script-cmd
bat-Startskripts Metadatenschlüssel:
sysprep-specialize-script-bat
Metadatenschlüssel:
windows-startup-script-bat
ps11-Startskripts Metadatenschlüssel:
sysprep-specialize-script-ps1
Metadatenschlüssel:
windows-startup-script-ps1

Ein in Cloud Storage gespeichertes Startskript zur Verfügung stellen

Sie können Ihr Skript in Cloud Storage speichern und beim Erstellen der Instanz die URL zu dem Skript angeben. So ist Ihr Startskript von überall aus zugänglich und Sie umgehen das Limit des Metadatenservers.

Zugriffsberechtigungen für Ihr Skript einrichten

Bevor Sie ein Startskript aus Cloud Storage verwenden können, muss Ihnen die Berechtigung zum Zugriff auf das Skript gewährt worden sein. Prüfen Sie die Zugriffskontrolleinstellungen für den Bucket und die Datei, um sicherzugehen, dass Sie die erforderlichen Berechtigungen haben.

Standardmäßig können Sie als Projektinhaber oder Bearbeiter auf Dateien im selben Projekt zugreifen, außer es gibt explizite Zugriffskontrollen, die dies verhindern.

Startskript bereitstellen

  1. Bucket erstellen Sie können einen Bucket erstellen oder einen vorhandenen Bucket verwenden. Informationen zum Erstellen eines Buckets finden Sie unter Bucket in der Google Cloud Console erstellen oder Bucket in gsutil erstellen.
  2. Laden Sie die Datei in den Bucket hoch. Befolgen Sie die Anleitung, um gsutil oder die Cloud Console zum Hochladen eines Objekts zu verwenden.
  3. Geben Sie die URL zur Startskriptdatei an, wenn Sie eine Instanz erstellen.

    Console

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

      Zu „VM-Instanzen“

    2. Klicken Sie auf Instanz erstellen.

    3. Geben Sie auf der Seite Neue Instanz erstellen die Attribute für Ihre Instanz an.

    4. Wählen Sie im Abschnitt Identität und API-Zugriff ein Dienstkonto aus, das Zugriff auf Ihre Startskriptdatei in Cloud Storage hat. Das Dienstkonto muss beispielsweise die Berechtigungen der Rolle Storage-Objekt-Betrachter haben.

    5. Maximieren Sie den Abschnitt Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten.

    6. Geben Sie im Abschnitt Metadaten startup-script-url als Metadatenschlüssel ein.

    7. Geben Sie im Feld Wert eine URL zur Startskriptdatei an, entweder im Format gs://BUCKET/FILE oder https://storage.googleapis.com/BUCKET/FILE.

    8. Klicken Sie auf Erstellen, um die Instanz zu erstellen.

    gcloud

    Erstellen Sie mit dem gcloud-Befehlszeilentool eine Instanz mit den Flags --scopes und --metadata und geben Sie den Schlüssel startup-script-url an. Das Flag --scopes gewährt der VM Zugriff auf Cloud Storage, um das Startskript herunterzuladen. Sie können die Cloud Storage-URL zu dem Skript entweder im Format gs://BUCKET/FILE oder https://storage.googleapis.com/BUCKET/FILE angeben.

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

    API

    Geben Sie in der API ein Startskript als Teil des Metadatenattributs in Ihrer Anfrage an und verwenden Sie startup-script-url als Metadatenschlüssel. Geben Sie außerdem eine Liste von scopes mit einem Cloud Storage-Bereich an, damit die VM auf die Startskriptdatei zugreifen kann:

    POST https://compute.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/FILE"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/e2-medium",
      "name": "example-instance"
    }
    

    Windows

    Erstellen Sie mit dem gcloud-Befehlszeilentool eine Instanz mit den Flags --scopes und --metadata und geben Sie den Schlüssel windows-startup-script-url an. Das Flag --scopes gewährt der VM Zugriff auf Cloud Storage, um das Startskript herunterzuladen. Sie können die Cloud Storage-URL zu dem Skript entweder im Format gs://BUCKET/FILE oder https://storage.googleapis.com/BUCKET/FILE angeben.

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

Ein Startskript auf laufende Instanzen anwenden

Fügen Sie das Startskript zu einer laufenden Instanz hinzu, um es beim nächsten Start der Instanz auszuführen. Das Startskript wird auch bei allen weiteren Neustarts ausgeführt.

Führen Sie die folgenden Schritte aus, um ein Startskript auf einer laufenden Instanz einzurichten:

Console

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

    Zu „VM-Instanzen“

  2. Klicken Sie auf die Instanz, der Sie ein Startskript hinzufügen möchten.

  3. Führen Sie auf der Seite mit den Instanzdetails die folgenden Schritte aus:

    1. Klicken Sie auf Bearbeiten.
    2. Klicken Sie unter Benutzerdefinierte Metadaten auf Element hinzufügen.
    3. Fügen Sie Ihr Startskript mit einem der folgenden Schlüssel hinzu:

      • startup-script: Geben Sie mit diesem Schlüssel direkt den Inhalt des Startskripts an.
      • startup-script-url: Geben Sie mit diesem Schlüssel die Cloud Storage-URL zur Startskriptdatei an.

gcloud

Verwenden Sie im gcloud-Befehlszeilentool den instances add-metadata-Befehl, um der Instanz Metadaten hinzuzufügen. Verwenden Sie einen der verfügbaren Startskriptschlüssel:

  • --metadata startup-script=CONTENTS: Geben Sie mit diesem Schlüssel direkt den Inhalt des Startskripts an.
  • --metadata startup-script-url=URL: Geben Sie mit diesem Schlüssel die Cloud Storage-URL zur Startskriptdatei an.
  • --metadata-from-file startup-script=FILE: Geben Sie eine lokal gespeicherte Startskriptdatei an.

Beispiel:

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

Stellen Sie in der API eine Anfrage an die instances().setMetadata-Methode, bei der Sie die neuen Metadaten und einen fingerprint-Wert angeben.

Ein Fingerabdruck ist eine Reihe zufälliger Zeichen, die von Compute Engine erstellt und für ein optimistisches Sperrverfahren genutzt werden. Geben Sie den entsprechenden Fingerabdruckwert an, um Ihre Anfrage durchzuführen. Dieser Fingerabdruck ändert sich nach jeder Anfrage. Geben Sie einen falschen an, wird Ihre Anfrage abgelehnt. So kann nur eine Aktualisierung auf einmal stattfinden und Probleme werden vermieden.

Führen Sie eine instances().get-Anfrage aus, um den aktuellen Fingerabdruck einer Instanz zu erhalten:

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

Kopieren Sie den Fingerabdruckwert:

{

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

Erstellen Sie dann eine Anfrage an die instances().setMetadata-Methode. Verwenden Sie dazu einen der folgenden Metadatenschlüssel und den Fingerabdruckwert:

  • startup-script: Geben Sie mit diesem Schlüssel direkt den Inhalt des Startskripts an.
  • startup-script-url: Geben Sie mit diesem Schlüssel die Cloud Storage-URL zur Startskriptdatei an.

Beispiel:

POST https://compute.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"
      }
     ]
    }

Startskript noch einmal ausführen

Sie können Ihre Startskripts auf Ihrer VM-Instanz noch einmal ausführen. Stellen Sie dazu eine Verbindung zur Instanz her und führen Sie einen der folgenden Befehle aus:

Für Images in Debian, CentOS und RHEL

sudo google_metadata_script_runner startup

GCEMetadataScripts: Starting startup scripts (version YYMMDD.NN).
GCEMetadataScripts: Found startup-script in metadata.
GCEMetadataScripts: startup-script exit status 0
GCEMetadataScripts: Finished running startup scripts.

Für Images in Container-optimierten Betriebssystemen, Ubuntu und SLES

sudo google_metadata_script_runner --script-type startup --debug

Logs für Startskripts ansehen

Die Startskriptausgabe wird in die folgenden Logdateien geschrieben:

  • CentOS und RHEL: /var/log/messages
  • Debian: /var/log/daemon.log
  • Ubuntu: /var/log/syslog
  • SLES: /var/log/messages

Sie können auch den Befehl journalctl verwenden, um die Ausgabe des Startskripts anzusehen.

sudo journalctl -u google-startup-scripts.service

Benutzerdefinierte Werte in Startskripts festlegen

Beim Ausführen von Startskripts über Instanzen hinweg kann es vorkommen, dass Sie im Startskript benutzerdefinierte Werte verwenden möchten. Es kann beispielsweise sein, dass Sie ein Startskript auf verschiedenen Instanzen ausführen und jede eine individuelle Nachricht ausgeben lassen möchten.

Diese benutzerdefinierten Werte können Sie bei der Instanzerstellung als Metadaten-Schlüssel/Wert-Paare angeben und darauf in den Startskripts verweisen. Weitere Informationen zum Erstellen benutzerdefinierter Metadatenschlüssel finden Sie unter Benutzerdefinierte Metadaten einrichten.

Wenn Sie ein benutzerdefiniertes Metadatenschlüsselpaar eingerichtet haben, können Sie Ihr Startskript ändern, um die neuen Metadaten abzufragen. Dieses Skript kann beispielsweise so geändert werden:

#! /bin/bash
VALUE_OF_FOO=$(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><h1>Hello World</h1>
<p>The value of foo: $VALUE_OF_FOO</p>
</body></html>
EOF

Nächste Schritte

Jetzt testen

Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie einfach ein Konto, um die Leistungsfähigkeit von Compute App Enginge in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.

Compute Engine kostenlos testen