gcloud-Tool-Befehle in Skripts verwenden

Sie können nicht nur Befehle des gcloud-Befehlszeilentools über die Befehlszeile ausführen, sondern auch in Skripts oder anderen Automatisierungen verwenden, zum Beispiel bei Verwendung von Jenkins zur Automatisierung von Google Cloud-Aufgaben.

Das Cloud SDK bietet eine Vielzahl von Tools wie Filtern, Formatieren und das Flag --quiet, mit dem Sie Ausgaben effizient verwalten und Aufgaben automatisieren können.

Grundlagen der Skripterstellung mit Cloud SDK

Eine detaillierte Anleitung zum Erstellen einfacher Skripts mit dem gcloud-Tool finden Sie in diesem Einsteigerleitfaden zum Automatisieren von Google Cloud-Aufgaben.

Autorisierung

Beim Erstellen von Skripts mit dem Cloud SDK müssen Autorisierungsmethoden berücksichtigt werden. Das Cloud SDK 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 führen Sie die Zugriffsautorisierung und andere gängige Cloud SDK-Einrichtungsschritte 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. Dies ist auch die empfohlene Autorisierungsmethode, wenn Sie gcloud-Tool-Befehle auf einer Compute Engine-VM-Instanz ausführen, auf der alle Nutzer Zugriff auf root haben.

Verwenden Sie für die Dienstkontoautorisierung ein vorhandenes Dienstkonto oder erstellen Sie auf der Seite "Dienstkonten" ein neues.

Zur Seite „Dienstkonten“

Wählen Sie zum Erstellen und Herunterladen des zugehörigen privaten Schlüssels als JSON-formatierte Schlüsseldatei im Aktionsmenü des Dienstkontos die Option Schlüssel verwalten aus.

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

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

Sie können eine SSH-Verbindung zu Ihrer VM-Instanz mit gcloud compute ssh herstellen und somit die Authentifizierung durchführen. SSH-Konfigurationsdateien können mit gcloud compute config-ssh konfiguriert werden.

Eine ausführliche Anleitung zur Autorisierung von Cloud SDK-Tools finden Sie in diesem umfassenden Leitfaden.

Eingabeaufforderungen deaktivieren

Einige gcloud-Tool-Befehle sind interaktiv und fordern Nutzer zur Bestätigung eines Vorgangs oder zur Eingabe zusätzlicher Eingaben für einen eingegebenen Befehl auf.

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 Aufforderungen der Befehle des gcloud-Tools deaktivieren. Dazu legen Sie das Attribut disable_prompts in Ihrer Konfiguration auf True oder {101 fest. }über das globale Flag --quiet oder -q ersetzt. 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

Damit Skripts mit dem gcloud-Tool erstellt werden können, ist eine vorhersagbare Ausgabe wichtig. Hier helfen die Flags --filter und --format. Wenn Sie einen Befehl mit dem gcloud-Tool ausführen, wird eine Ausgabe erzeugt, die dem Format (JSON, YAML, CSV und Text) und dem Filter (VM-Namen mit Präfix) entspricht. mit "test", Erstellungsdatum nach 2015 usw.).

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 häufige Verwendungen von Formatieren und Filtern mit Befehlen des gcloud-Tools:

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 nach der Festlegung der Datumsformatierung auf den Schlüssel "createTime" angewendet.

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)'

Weitere Beispiele für die Ausgabekonfigurationsfunktionen, die in filters, formats und projections des gcloud-Tools eingebunden sind-Flags finden Sie in diesem Blogpost zum Filtern und Formatieren.

Best Practices

Wenn ein Skript oder eine andere Automatisierung basierend auf der Ausgabe eines gcloud-Befehls bedingt Aktionen ausführen soll, beachten Sie Folgendes:

  • 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 des gcloud-Tools ändern und damit die 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 ändern, indem Sie projections verwenden. Verwenden Sie das Flag --filter, um eine Untergruppe 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

Mithilfe der Funktionalität von Format und Filter können Sie gcloud-Toolbefehle in einem Skript kombinieren, um eingebettete Informationen einfach zu extrahieren.

Wenn Sie alle Schlüssel auflisten möchten, die allen Dienstkonten Ihrer Projekte zugeordnet sind, müssen Sie alle Projekte iterieren und für jedes Projekt alle zugehörigen Dienstkonten abrufen. Rufen Sie für jedes Dienstkonto alle Schlüssel ab. Dies kann so bewerkstelligt werden:

Als Bash-Skript:

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

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"
      }
  }
}

Häufig muss die Ausgabe zur Verarbeitung geparst werden. Dabei ist es beispielsweise hilfreich, die Informationen zum Dienstkonto in ein Array zu schreiben und die Werte in dem mehrwertigen Feld serviceAccounts.scope() mit CSV-Format zu trennen. wie im folgenden Script gezeigt:

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