gcloud-Befehlszeilenbefehle in Skripts verwenden

Sie können Google Cloud CLI-Befehle nicht nur über die Befehlszeile, sondern auch in Skripts oder anderen Automatisierungen ausführen, z. B. wenn Sie Jenkins zur Automatisierung von Google Cloud-Aufgaben verwenden.

Die gcloud CLI bietet eine Vielzahl von Tools wie Filtern, Formatieren und das Flag --quiet, mit denen Sie Ausgaben effektiv verwalten und Aufgaben automatisieren können.

Grundlagen des Scripting mit der gcloud CLI

Eine detaillierte Anleitung zum Erstellen grundlegender Skripts mit der gcloud CLI finden Sie in diesem Blogpost: Scripting with gcloud: a beginner’s guide to automating Google Cloud tasks.

Autorisierung

Beim Erstellen von Skripts mit der gcloud CLI müssen Sie Autorisierungsmethoden berücksichtigen. Die gcloud CLI bietet zwei Optionen:

  • Autorisierung über ein Nutzerkonto
  • Autorisierung über ein Dienstkonto

Die Autorisierung über ein Nutzerkonto empfiehlt sich, wenn Sie ein Skript oder eine andere Automatisierung auf einem einzigen Rechner ausführen.

So autorisieren Sie den Zugriff und führen weitere gängige Einrichtungsschritte für die gcloud CLI aus:

gcloud init

Die Autorisierung über ein Dienstkonto empfiehlt sich, wenn Sie ein Skript oder eine andere Automatisierung auf mehreren Rechnern in einer Produktionsumgebung bereitstellen. Diese Autorisierungsmethode wird auch empfohlen, wenn Sie gcloud CLI-Befehle auf einer Compute Engine-VM-Instanz ausführen, in der alle Nutzer Zugriff auf root haben.

Verwenden Sie ein vorhandenes Dienstkonto oder erstellen Sie auf der Seite „Dienstkonten“ ein neues, um die Dienstkontoautorisierung zu verwenden:

Zur Seite „Dienstkonten“

Wählen Sie im Aktionsmenü des Dienstkontos Schlüssel verwalten aus, um den zugehörigen privaten Schlüssel als Schlüsseldatei im JSON-Format zu erstellen und herunterzuladen.

Führen Sie zum Ausführen der Autorisierung gcloud auth activate-service-account aus:

gcloud auth activate-service-account --key-file [KEY_FILE]

Sie können eine SSH-Verbindung zur VM-Instanz mit gcloud compute ssh herstellen, das die Authentifizierung übernimmt. SSH-Konfigurationsdateien können mit gcloud compute config-ssh konfiguriert werden.

Eine ausführliche Anleitung zum Autorisieren von gcloud CLI-Tools finden Sie unter gcloud CLI autorisieren.

Eingabeaufforderungen deaktivieren

Einige gcloud-Kommandozeilenbefehle sind interaktiv und fordern Nutzer zur Bestätigung eines Vorgangs auf oder erfordern zusätzliche Angaben zu einem eingegebenen Befehl.

Bei der Ausführung von Befehlen in einem Skript oder einer anderen Automatisierung ist dies jedoch in den meisten Fällen nicht zu empfehlen. Sie können Eingabeaufforderungen von gcloud CLI-Befehlen deaktivieren, indem Sie das Attribut disable_prompts in Ihrer Konfiguration auf True setzen oder das globale Flag --quiet oder -q verwenden. Die meisten interaktiven Befehle bieten Standardwerte für den Fall, dass eine zusätzliche Bestätigung oder Eingabe erforderlich ist. Wenn Sie Eingabeaufforderungen deaktivieren, werden diese Standardwerte verwendet.

Beispiel:

gcloud debug targets list --quiet

Ausgabe filtern und formatieren

Wenn Sie Skripts mit der gcloud CLI erstellen möchten, ist eine vorhersehbare Ausgabe wichtig. Hier helfen die Flags --filter und --format. Sie sorgen dafür, dass beim Ausführen eines Befehls über die gcloud CLI eine Ausgabe erzeugt wird, die Ihren Formatspezifikationen (z. B. JSON, YAML, CSV und Text) und Filter (VM-Namen mit dem Präfix „test“, Erstellungsjahr nach 2015 usw.) entspricht.

Klicken Sie auf folgende Schaltfläche, um eine interaktive Anleitung zur Verwendung des Filters und der Format-Flags zu starten:

In Cloud Shell öffnen

Die folgenden Beispiele zeigen gängige Einsatzmöglichkeiten beim Formatieren und Filtern mit gcloud-Befehlen:

Instanzen aufführen, die in der Zone us-central1-a erstellt wurden:

gcloud compute instances list --filter="zone:us-central1-a"

Projekte, in denen die Labels bestimmten Werten entsprechen (z. B. "labels.env" ist "test" und "labels.version" ist "alpha") im JSON-Format auflisten:

gcloud projects list --format="json" \
  --filter="labels.env=test AND labels.version=alpha"

Projekte mit Erstellungsdatum und -zeit nach der lokalen Zeitzone auflisten:

gcloud projects list \
  --format="table(name, project_id, createTime.date(tz=LOCAL))"

Projekte, die nach einem bestimmten Datum erstellt wurden, im Tabellenformat auflisten:

gcloud projects list \
  --format="table(projectNumber,projectId,createTime)" \
  --filter="createTime.date('%Y-%m-%d', Z)='2016-05-11'"

Im letzten Beispiel wurde eine Projektion für den Schlüssel verwendet. Der Filter wird auf die Taste createTime angewendet, nachdem die Datumsformatierung festgelegt wurde.

Kontingente für eine Region in einer verschachtelten Tabelle auflisten:

gcloud compute regions describe us-central1 \
  --format="table(quotas:format='table(metric,limit,usage)')"

Globale Kontingente als vereinfachte Liste im CSV-Format ausgeben:

gcloud compute project-info describe --flatten='quotas[]' \
  --format='csv(quotas.metric,quotas.limit,quotas.usage)'

Compute-Instanzressourcen mit Kästchen und Titeln nach Name sortiert im Tabellenformat auflisten:

gcloud compute instances list \
  --format='table[box,title=Instances](name:sort=1,zone:label=zone,status)'

Die im Projekt authentifizierte E-Mail-Adresse des Nutzers auflisten:

gcloud info --format='value(config.account)'

Detailliertere Beispiele für die Funktionen zur Ausgabekonfiguration, die in die Flags filters, formats und projections der gcloud CLI integriert sind, finden Sie in diesem Blogpost zu Filtern und Formatierung.

Best Practices

Wenn Sie möchten, dass ein Skript oder eine andere Automatisierungsmethode auf der Grundlage der Ausgabe eines gcloud-Kommandozeilenbefehls bedingte Aktionen ausführt, achten Sie auf dies:

  • Machen Sie Aktionen vom Exit-Status von Befehlen abhängig.

    Wenn der Exit-Status nicht Null ist, ist ein Fehler aufgetreten und die Ausgabe ist möglicherweise unvollständig, sofern in der Befehlsdokumentation nicht anders angegeben. Ein Beispiel ist ein Befehl zur Erstellung mehrerer Ressourcen, der nur einen Teil der Ressourcen erstellt, diese in der Standardausgabe auflistet und dann den Vorgang mit einem Status ungleich Null beendet. Alternativ können Sie das show_structured_logs-Attribut zum Parsen von Fehlerlogs verwenden. Führen Sie gcloud config aus, um weitere Informationen zu erhalten.

  • Machen Sie keine Aktionen von Meldungen abhängig, die an die Standardfehlerausgabe gesendet werden.

    Der Wortlaut dieser Nachrichten kann sich in zukünftigen Versionen der gcloud CLI ändern und Ihre Automatisierung beeinträchtigen.

  • Machen Sie keine Aktionen von der Rohausgabe von Meldungen abhängig, die an die Standardausgabe gesendet werden.

    Die Standardausgabe für Befehle kann sich in einem zukünftigen Release ändern. Sie können die Auswirkungen dieser Änderungen minimieren. Dazu verwenden Sie das Flag --format, um die Ausgabe mit einer der folgenden Optionen zu formatieren: --format=json|yaml|csv|text|list zum Angeben der Werte, die zurückgegeben werden sollen. Führen Sie gcloud topic formats für weitere Optionen aus.

    Sie können die Standardausgabe von --format mit projections ändern. Für einen höheren Detaillierungsgrad können Sie das Flag --filter verwenden, um eine Teilmenge der Werte basierend auf einem Ausdruck zurückzugeben. Sie können dann das Skript auf Basis dieser zurückgegebenen Werte erstellen.

    Beispiele zum Formatieren und Filtern der Ausgabe finden Sie im folgenden Abschnitt.

Beispielskripte

Mit den Formatierungs- und Filterfunktionen können Sie gcloud CLI-Befehle in einem Skript kombinieren, um eingebettete Informationen auf einfache Weise zu extrahieren.

Schlüssel für alle Dienstkonten Ihrer Projekte auflisten

In den folgenden Beispielskripts werden die mit allen Dienstkonten Ihrer Projekte verknüpften Schlüssel aufgelistet:

  • Projekte iterieren
  • Für jedes Projekt die zugehörigen Dienstkonten abrufen
  • Abrufen der zugehörigen Schlüssel für jedes Dienstkonto

Bash

#!/bin/bash
for project in  $(gcloud projects list --format="value(projectId)")
do
  echo "ProjectId:  $project"
  for robot in $(gcloud iam service-accounts list --project $project --format="value(email)")
   do
     echo "    -> Robot $robot"
     for key in $(gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())")
        do
          echo "        $key"
     done
   done
done

Windows PowerShell

Oder als Windows PowerShell-Skript:

foreach ($project in gcloud projects list --format="value(projectId)")
{
  Write-Host "ProjectId: $project"
  foreach ($robot in  gcloud iam service-accounts list --project $project --format="value(email)")
  {
      Write-Host "    -> Robot $robot"
      foreach ($key in gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())")
      {
        Write-Host "        $key"
      }
  }
}

Ausgabe zur Verarbeitung parsen

Im folgenden Beispiel wird das Parsen der Ausgabe zur Verarbeitung veranschaulicht. Insbesondere schreibt das Beispielskript die Dienstkontoinformationen in ein Array und trennt Werte im mehrwertigen Feld serviceAccounts.scope() im CSV-Format:

#!/bin/bash
for scopesInfo in $(
    gcloud compute instances list --filter=name:instance-1 \
        --format="csv[no-heading](name,id,serviceAccounts[].email.list(),
                      serviceAccounts[].scopes[].map().list(separator=;))")
do
      IFS=',' read -r -a scopesInfoArray<<< "$scopesInfo"
      NAME="${scopesInfoArray[0]}"
      ID="${scopesInfoArray[1]}"
      EMAIL="${scopesInfoArray[2]}"
      SCOPES_LIST="${scopesInfoArray[3]}"

      echo "NAME: $NAME, ID: $ID, EMAIL: $EMAIL"
      echo ""
      IFS=';' read -r -a scopeListArray<<< "$SCOPES_LIST"
      for SCOPE in  "${scopeListArray[@]}"
      do
        echo "  SCOPE: $SCOPE"
      done
done