Creazione di script dei comandi dell'interfaccia a riga di comando gcloud

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Oltre a eseguire comandi di Google Cloud CLI dalla riga di comando, puoi eseguirli da script o altre automazioni, ad esempio quando si utilizza Jenkins per gestire l'automazione delle attività di Google Cloud.

L'interfaccia a riga di comando gcloud è dotata di una serie di strumenti come filtri, formattazione e flag --quiet, che ti consentono di gestire in modo efficace l'output e di automatizzare le attività.

Nozioni di base sullo script con l'interfaccia a riga di comando gcloud

Per una guida passo passo per la creazione di script di base con l'interfaccia a riga di comando gcloud, consulta questo post del blog: Scripting with gcloud: a Beginner's guide to autom di Google Cloud attività.

Autorizzazione

Quando crei script con l'interfaccia a riga di comando gcloud, devi considerare i metodi di autorizzazione. L'interfaccia a riga di comando gcloud fornisce due opzioni:

  • Autorizzazione account utente
  • Autorizzazione tramite account di servizio

L'autorizzazione dell'account utente è consigliata se esegui uno script o un'altra automazione su un'unica macchina.

Per autorizzare l'accesso ed eseguire altri passaggi comuni di configurazione dell'interfaccia a riga di comando gcloud:

gcloud init

L'autorizzazione dell'account di servizio è consigliata se esegui il deployment di uno script o di un'altra automazione su più macchine in un ambiente di produzione. È anche il metodo di autorizzazione consigliato se esegui comandi gcloud dell'interfaccia a riga di comando su un'istanza di macchina virtuale Compute Engine in cui tutti gli utenti hanno accesso a root.

Per utilizzare l'autorizzazione dell'account di servizio, utilizza un account di servizio esistente o creane uno nuovo nella pagina Account di servizio:

Vai alla pagina Account di servizio

Per creare e scaricare la chiave privata associata come file di chiave in formato JSON, scegli Gestisci chiavi dal menu delle azioni per l'account di servizio.

Per eseguire l'autorizzazione, esegui gcloud auth activate-service-account:

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

Per accedere tramite SSH all'istanza VM, utilizza gcloud compute ssh, che si occupa dell'autenticazione. I file di configurazione SSH possono essere configurati utilizzando gcloud compute config-ssh.

Per istruzioni dettagliate sull'autorizzazione degli strumenti dell'interfaccia a riga di comando gcloud, consulta Autorizzazione dell'interfaccia a riga di comando gcloud.

Disattivazione richieste

Alcuni comandi dell'interfaccia a riga di comando gcloud sono interattivi, richiedono agli utenti la conferma di un'operazione o richiedono input aggiuntivi per un comando inserito.

Nella maggior parte dei casi, questo non è preferibile quando si eseguono comandi in uno script o in un'altra automazione. Puoi disattivare i messaggi dei comandi dell'interfaccia a riga di comando gcloud impostando la proprietà disable_prompts nella tua configurazione su True o utilizzando il flag globale --quiet o -q. La maggior parte dei comandi interattivi ha valori predefiniti quando è necessaria un'ulteriore conferma o un'operazione di input. Se le richieste sono disabilitate, vengono utilizzati questi valori predefiniti.

Ad esempio:

gcloud debug targets list --quiet

Filtraggio e formattazione dell'output

Per creare script con l'interfaccia a riga di comando gcloud, è importante avere un output prevedibile, poiché è utile questa operazione per i flag --filter e --format. Consentono di assicurare che quando esegui un comando utilizzando l'interfaccia a riga di comando gcloud, verrà prodotto un output conforme al tuo formato (ad esempio json, yaml, csv e text) e al filtro (nomi di VM preceduti da 'test', anno di creazione dopo il 2015 e così via).

Se vuoi seguire un tutorial interattivo sull'utilizzo dei filtri e dei flag di formato, avvia il tutorial utilizzando il seguente pulsante:

Apri in Cloud Shell

Gli esempi seguenti illustrano gli utilizzi comuni di formattazione e filtraggio con i comandi dell'interfaccia a riga di comando gcloud:

Elenca le istanze create nella zona us-central1-a:

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

Elenca in formato JSON i progetti in cui le etichette corrispondono a valori specifici (ad es. label.env è 'test' ed label.version è alpha):

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

Elenca i progetti con la data e l'ora di creazione specificate nel fuso orario locale:

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

Elenca i progetti creati dopo una data specifica in formato tabella:

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

Nota che nell'ultimo esempio è stata utilizzata una proiezione sulla chiave. Il filtro viene applicato alla chiave createTime dopo l'impostazione della formattazione della data.

Elenca una tabella nidificata delle quote di una regione:

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

Stampa un elenco suddiviso delle quote globali in formato CSV:

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

Elenca le risorse dell'istanza Compute con decorazioni e titoli di caselle, ordinate per nome, in formato tabella:

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

Elenca l'indirizzo email dell'utente autenticato al progetto:

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

Per altri esempi sulle funzionalità di configurazione dell'output integrate nei flag filters, formats e projections dell'interfaccia a riga di comando di gcloud, consulta questo post del blog sui filtri e la formattazione.

Best practice

Se vuoi che uno script o un'altra automazione eseguano azioni in modo condizionale in base all'output di un comando dell'interfaccia a riga di comando gcloud, osserva quanto segue:

  • Dipende dallo stato di uscita del comando.

    Se lo stato di uscita è diverso da zero, si è verificato un errore e l'output potrebbe essere incompleto, a meno che la documentazione del comando non indichi diversamente. Ad esempio, un comando che crea più risorse può solo crearne alcune, elencarle nell'output standard e poi uscire con uno stato diverso da zero. In alternativa, puoi utilizzare la proprietà show_structured_logs per analizzare i log degli errori. Esegui gcloud config per ulteriori dettagli.

  • Non dipende dai messaggi stampati in base all'errore standard.

    Il testo di questi messaggi può cambiare nelle future versioni dell'interfaccia a riga di comando gcloud e interrompere l'automazione.

  • Non dipende dall'output non elaborato dei messaggi stampati nell'output standard.

    L'output predefinito di qualsiasi comando potrebbe cambiare in una release futura. Puoi ridurre al minimo l'impatto di queste modifiche utilizzando il flag --format per formattare l'output con uno dei seguenti elementi: --format=json|yaml|csv|text|list per specificare i valori da restituire. Esegui gcloud topic formats per ulteriori opzioni.

    Puoi modificare l'output predefinito da --format utilizzando projections. Per una maggiore granularità, utilizza il flag --filter per restituire un sottoinsieme di valori in base a un'espressione. Dopodiché puoi scrivere su tali valori restituiti.

    Gli esempi di formattazione e di output dei filtri sono disponibili nella sezione di seguito.

Script di esempio

Utilizzando la funzionalità di formato e filtro, puoi combinare i comandi dell'interfaccia a riga di comando gcloud in uno script per estrarre facilmente le informazioni incorporate.

Elenco delle chiavi per tutti gli account di servizio dei progetti

I seguenti script di esempio elencano le chiavi associate a tutti gli account di servizio dei tuoi progetti in base a:

  • Iterazione dei tuoi progetti
  • Per ogni progetto, ottieni gli account di servizio associati
  • Per ogni account di servizio, ottieni le chiavi associate

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

Oppure, come Windows PowerShell:

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

Analizza l'output per l'elaborazione

Il seguente esempio mostra l'analisi dell'output per l'elaborazione. In particolare, lo script di esempio scrive le informazioni dell'account di servizio in un array e separa i valori nel campo serviceAccounts.scope() in formato CSV a più valori:

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