Créer des scripts pour les commandes de CLI gcloud

En plus de pouvoir exécuter des commandes de CLI gcloud depuis la ligne de commande, vous pouvez également les exécuter à partir de scripts ou d'autres types de traitement automatisé, par exemple lorsque vous utilisez Jenkins pour piloter l'automatisation des tâches de Google Cloud Platform.

Autorisation

Les outils du SDK Google Cloud acceptent deux méthodes d'autorisation :

  • Autorisation via un compte utilisateur
  • Autorisation via un compte de service

L'autorisation via un compte utilisateur est recommandée si vous exécutez un script ou une autre forme d'automatisation sur une seule machine.

Pour autoriser l'accès et exécuter d'autres étapes courantes de configuration du SDK Cloud :

    gcloud init

L'autorisation via un compte de service est recommandée si vous déployez un script ou une autre forme d'automatisation sur des machines d'un environnement de production. C'est également la méthode d'autorisation recommandée si vous exécutez des commandes de CLI gcloud sur une instance de machine virtuelle Google Compute Engine où tous les utilisateurs ont accès à root.

Pour appliquer l'autorisation via un compte de service, utilisez un compte de service existant ou créez-en un sur la console Google Cloud Platform. Dans la colonne des options de la table des comptes de service, créez et téléchargez la clé privée associée en tant que fichier de clé au format JSON.

Pour exécuter l'autorisation, utilisez gcloud auth activate-service-account :

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

Vous pouvez vous connecter en SSH à votre instance de VM en utilisant gcloud compute ssh, qui s’occupe de l’authentification. Les fichiers de configuration SSH peuvent être définis à l'aide de gcloud compute config-ssh.

Pour obtenir des instructions détaillées sur l’autorisation des outils du SDK Cloud, reportez-vous à ce guide complet.

Désactiver les invites

Certaines commandes de CLI gcloud sont interactives et invitent les utilisateurs à confirmer une opération ou demandent une entrée supplémentaire pour une commande saisie.

Dans la plupart des cas, ce comportement n'est pas souhaitable lors de l'exécution de commandes dans un script ou une autre forme d'automatisation. Vous pouvez désactiver les invites des commandes de la CLI gcloud en définissant la propriété disable_prompts dans votre configuration sur True ou en utilisant l'indicateur global --quiet ou -q. La plupart des commandes interactives possèdent des valeurs par défaut lorsqu'une confirmation ou une entrée supplémentaire est requise. Si les invites sont désactivées, ces valeurs par défaut sont utilisées.

Exemple :

    gcloud --quiet debug targets list

Notez que l'indicateur --quiet est inséré en premier.

Traiter le résultat

Si vous souhaitez qu'un script ou une autre forme d'automatisation exécute des actions de manière conditionnelle en fonction du résultat d'une commande de CLI gcloud, tenez compte des éléments suivants :

  • Ne vous fiez pas aux messages affichés avec une erreur standard.

    Ceux-ci peuvent changer dans les futures versions de la CLI gcloud et interrompre votre mécanisme d'automatisation.

  • Ne vous fiez pas au résultat brut des messages affichés avec la sortie standard.

    Le résultat par défaut d'une commande peut changer dans une version ultérieure. Vous pouvez minimiser l'impact de ces changements en utilisant l'indicateur --format pour mettre en forme le résultat avec l'un des éléments suivants : --format=json|yaml|csv|text|list pour spécifier les valeurs à renvoyer. Exécutez $ gcloud topic formats pour obtenir plus d'options.

    Vous pouvez modifier le résultat par défaut de --format en utilisant projections. Pour une granularité accrue, utilisez l'indicateur --filter pour renvoyer un sous-ensemble de valeurs basé sur une expression. Vous pouvez ensuite écrire un script par rapport à ces valeurs renvoyées.

    Vous trouverez des exemples de mise en forme et de filtrage du résultat dans la section ci-dessous.

  • Fiez-vous à l'état de sortie de la commande.

    Si l'état de sortie est différent de zéro, une erreur s'est produite et le résultat peut être incomplet, sauf indication contraire dans la documentation de la commande. Par exemple, une commande qui crée plusieurs ressources peut n'en créer que quelques-unes, les répertorier sur la sortie standard, puis se terminer avec un état différent de zéro. Vous pouvez également utiliser la propriété show_structured_logs pour analyser les journaux d'erreurs. Exécutez $ gcloud config pour plus de détails.

Exemples de filtrage et de mise en forme

Si vous souhaitez passer par un tutoriel interactif sur l'utilisation des indicateurs de filtre et de format, lancez-le à l'aide du bouton suivant :

Ouvrir dans Cloud Shell

Voici des exemples d'utilisations courantes de la mise en forme et du filtrage avec les commandes de CLI gcloud :

Répertorier les instances créées dans la zone us-central1-a :

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

Répertorier au format JSON les projets pour lesquels les libellés correspondent à des valeurs spécifiques (par exemple, label.env est 'test' et label.version est alpha) :

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

Répertorier les projets avec leur date et heure de création dans le fuseau horaire local :

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

Répertorier les projets créés après une date donnée sous forme de table :

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

Notez que, dans le dernier exemple, une projection sur la clé a été utilisée. Le filtre est appliqué à la clé createTime une fois le format de la date défini.

Répertorier une table imbriquée des quotas d'une région :

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

Afficher une liste aplatie des quotas globaux au format CSV :

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

Répertorier les ressources d'instance de calcul avec les attributs et les titres de cadre, triées par nom, sous forme de table :

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

Répertorier l'adresse e-mail de l'utilisateur authentifié du projet :

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

Exemples de scripts

En utilisant cette fonctionnalité de mise en forme et de filtrage, vous pouvez combiner des commandes de CLI gcloud dans un script afin d'extraire facilement les informations intégrées.

Si vous devez répertorier toutes les clés associées à tous les comptes de service de vos projets, vous devez effectuer une itération sur tous vos projets et, pour chaque projet, obtenir tous les comptes de service associés. Pour chaque compte de service, obtenez toutes les clés. Vous pouvez y parvenir comme démontré ci-dessous :

Via un script 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

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

Vous aurez souvent besoin d'analyser le résultat pour traitement. Par exemple, il serait utile d'écrire les informations de compte de service dans un tableau et de séparer les valeurs dans le champ serviceAccounts.scope() à valeurs multiples au format CSV. Le script ci-dessous s'en charge :

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

En savoir plus

Pour un guide par étapes sur la création de scripts de base avec la CLI gcloud, reportez-vous à ce guide du débutant pour l’automatisation des tâches GCP.

Des exemples plus approfondis des fonctions de configuration du résultat intégrées aux fonctions filters, formats, et projections de la CLI gcloud sont disponibles dans cet article de blog sur le filtrage et la mise en forme.