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

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

Gcloud CLI include una serie di strumenti come filtri, formattazione e flag --quiet, che ti consentono di gestire in modo efficace l'output e automatizzare le attività.

Nozioni di base sugli script con gcloud CLI

Per una guida passo passo alla creazione di script di base con gcloud CLI, consulta questo post del blog: Esecuzione di script con gcloud: guida per principianti all'automazione delle attività di Google Cloud.

Autorizzazione

Quando crei script con gcloud CLI, devi prendere in considerazione i metodi di autorizzazione. gcloud CLI offre 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 una singola macchina.

Per autorizzare l'accesso ed eseguire altri passaggi comuni di configurazione gcloud CLI:

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. È inoltre il metodo di autorizzazione consigliato se esegui i comandi gcloud CLI su un'istanza di macchina virtuale di Compute Engine in cui tutti gli utenti hanno accesso a root.

Per utilizzare l'autorizzazione dell'account di servizio, usa 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 chiavi in formato JSON, scegli Gestisci chiavi dal menu azione per l'account di servizio.

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

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

Puoi connetterti tramite SSH alla tua istanza VM utilizzando 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 gcloud CLI, consulta Autorizzazione di gcloud CLI.

Disattivazione dei prompt

Alcuni comandi dellgcloud CLI sono interattivi e richiedono agli utenti di confermare un'operazione o di richiedere input aggiuntivi per un comando inserito.

Nella maggior parte dei casi, ciò non è desiderabile quando si eseguono comandi in uno script o in altre automazioni. Per disabilitare i prompt dei comandi dell'interfaccia a riga di comando gcloud, imposta la proprietà disable_prompts nella configurazione su True oppure utilizzando il flag globale --quiet o -q. La maggior parte dei comandi interattivi ha valori predefiniti quando sono richiesti input o conferma aggiuntivi. Se le richieste sono disabilitate, vengono utilizzati questi valori predefiniti.

Ad esempio:

gcloud debug targets list --quiet

Output di filtri e formattazione

Per creare script con gcloud CLI, è importante avere un output prevedibile; è qui che sono utili i flag --filter e --format. Questi assicurano che quando esegui un comando usando gcloud CLI, viene generato un output conforme alle tue specifiche di formato (come json, yaml, csv e text) e che i filtri (i nomi delle VM sono preceduti dal prefisso "test", l'anno di creazione dopo il 2015 e così via).

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

Apri in Cloud Shell

I seguenti esempi illustrano gli utilizzi comuni della formattazione e dei filtri con i comandi gcloud CLI:

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" e 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'"

Tieni presente che nell'ultimo esempio è stata utilizzata una proiezione sulla chiave. Il filtro viene applicato alla chiave createTime dopo aver impostato la 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 della casella, 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 del progetto:

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

Per esempi più coinvolti delle funzionalità di configurazione dell'output integrate nei flag filters, formats e projections di gcloud CLI, consulta questo post del blog su filtri e formattazione.

best practice

Se vuoi che uno script o un'altra automazione esegua azioni in modo condizionale sulla base dell'output di un comando gcloud CLI, 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ò crearne solo alcune, elencarle nell'output standard e quindi 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 dipendere dai messaggi con errori standard.

    Il testo di questi messaggi potrebbe cambiare nelle versioni future di gcloud CLI e interrompere l'automazione.

  • Non dipendere dall'output non elaborato dei messaggi stampati su un output standard.

    L'output predefinito per 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 valori: --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. Puoi quindi eseguire lo script in base ai valori restituiti.

    Esempi di output di formattazione e filtro sono disponibili nella sezione seguente.

Script di esempio

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

Elenca le chiavi per tutti gli account di servizio dei tuoi progetti

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

  • Ripetizione dei progetti
  • Per ogni progetto, ottenere gli account di servizio associati
  • Recupero delle chiavi associate per ogni account di servizio

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 illustra l'analisi dell'output per l'elaborazione. In particolare, lo script di esempio scrive le informazioni dell'account di servizio in un array e codifica 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