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

Oltre a eseguire i comandi dell'interfaccia a riga di comando di Google Cloud 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.

L'interfaccia a riga di comando gcloud include una serie di strumenti come l'applicazione di filtri, la formattazione e il flag --quiet, che consentono di gestire in modo efficace l'output e l'automazione delle 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 Scripting con gcloud: una guida per nuovi utenti all'automazione delle attività di Google Cloud.

Autorizzazione

Durante la creazione di script con l'interfaccia a riga di comando gcloud, devi prendere in considerazione i metodi di autorizzazione. L'interfaccia a riga di comando gcloud 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 della 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 sulle macchine in un ambiente di produzione. È anche il metodo di autorizzazione consigliato se esegui i comandi dell'interfaccia a riga di comando gcloud su un'istanza di macchina virtuale Compute Engine in cui tutti gli utenti hanno accesso a root.

Per utilizzare l'autorizzazione di un 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 Manage Keys (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]

Per accedere tramite SSH alla tua 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, vedi Autorizzazione dell'interfaccia a riga di comando gcloud.

Disattivazione richieste in corso...

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

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

Ad esempio:

gcloud debug targets list --quiet

Filtri e formattazione dell'output

Per creare uno script con l'interfaccia a riga di comando gcloud, è importante avere un output prevedibile: è qui che possono essere utili i flag --filter e --format. Garantiscono che, quando esegui un comando utilizzando l'interfaccia a riga di comando gcloud, viene generato un output conforme al tuo formato (ad esempio json, yaml, csv e testo) e alle specifiche del filtro (i nomi delle VM contengono il prefisso 'test' e l'anno di creazione dopo il 2015).

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

Apri in Cloud Shell

I seguenti esempi illustrano alcuni usi comuni della formattazione e dei filtri 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' 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 della chiave. Il filtro viene applicato alla chiave createTime dopo aver impostato la formattazione della data.

Elenca una tabella nidificata delle quote di un'area geografica:

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

Stampa un elenco semplificato di quote globali in formato CSV:

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

Elenca le risorse di Compute Compute con decorazioni e titoli delle caselle, ordinate per nome, nel 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 di funzionalità di configurazione dell'output integrate nei flag dell'interfaccia a riga di comando gcloud filters, formats e projections, consulta questo post del blog sui filtri e la formattazione.

Best practice

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

  • Dipende dallo stato dell'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 preveda diversamente. Ad esempio, un comando che crea più risorse potrebbe 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 maggiori dettagli.

  • Non dipendere dai messaggi stampati che contengono errori standard.

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

  • Non dipendere dall'output non elaborato dei messaggi stampati nell'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 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 eseguire lo script per i valori restituiti.

    Per esempi di formattazione e per l'applicazione di filtri, consulta la sezione più avanti.

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.

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

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

  • Iterazione sui progetti
  • Per ogni progetto, recupero degli account di servizio associati
  • Per ogni account di servizio, recupera 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

L'esempio seguente 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 più valori in formato CSV:

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