Creación de scripts de comandos CLI de gcloud

Además de ejecutar comandos de Google Cloud CLI desde la línea de comandos, puedes ejecutarlos desde scripts u otras automatizaciones, por ejemplo, al usar Jenkins para impulsar la automatización de Google Cloud tareas.

gcloud CLI viene con una variedad de herramientas como filtrado, formato y el indicador --quiet , lo que le permite manejar eficazmente la salida y automatizar tareas.

Conceptos básicos de scripting con gcloud CLI

Para obtener una guía paso a paso sobre cómo crear scripts básicos con la CLI de gcloud, consulte esta publicación de blog: Creación de scripts con gcloud: una guía para principiantes sobre cómo automatizar Google Cloud tareas .

Autorización

Al crear scripts con gcloud CLI, deberá tener en cuenta los métodos de autorización . gcloud CLI ofrece dos opciones:

  • Autorización de cuenta de usuario
  • Autorización de cuenta de servicio

Se recomienda la autorización de la cuenta de usuario si está ejecutando un script u otra automatización en una sola máquina.

Para autorizar el acceso y realizar otros pasos comunes de configuración de gcloud CLI:

gcloud init

Se recomienda la autorización de la cuenta de servicio si se implementa un script u otra automatización en máquinas de un entorno de producción. También es el método de autorización recomendado si se ejecutan comandos de la CLI de gcloud en una instancia de máquina virtual de Compute Engine donde todos los usuarios tienen acceso a root .

Para utilizar la autorización de la cuenta de servicio, utilice una cuenta de servicio existente o cree una nueva en la página Cuentas de servicio:

Vaya a la página de Cuentas de servicio

Para crear y descargar la clave privada asociada como un archivo de clave con formato JSON, elija Administrar claves en el menú de acciones de la cuenta de servicio.

Para ejecutar la autorización, ejecute gcloud auth activate-service-account :

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

Puedes acceder a tu instancia de máquina virtual por SSH mediante gcloud compute ssh , que se encarga de la autenticación. Los archivos de configuración de SSH se pueden configurar mediante gcloud compute config-ssh .

Para obtener instrucciones detalladas sobre cómo autorizar las herramientas gcloud CLI, consulte Autorización de gcloud CLI .

Deshabilitar indicaciones

Algunos comandos CLI de gcloud son interactivos y solicitan a los usuarios que confirmen una operación o solicitan información adicional para un comando ingresado.

En la mayoría de los casos, esto no es recomendable al ejecutar comandos en un script u otra automatización. Puede deshabilitar las solicitudes de los comandos de la CLI de gcloud estableciendo la propiedad " disable_prompts " en su configuración como " True o usando el indicador global --quiet o -q ". La mayoría de los comandos interactivos tienen valores predeterminados cuando se requiere confirmación o entrada adicional. Si las solicitudes están deshabilitadas, se utilizan estos valores predeterminados.

Por ejemplo:

gcloud debug targets list --quiet

Filtrado y formato de salida

Para crear scripts con la CLI de gcloud, es importante tener una salida predecible; aquí es donde los indicadores --filter y --format son útiles. Garantizan que, al ejecutar un comando con la CLI de gcloud, se produzca una salida que cumpla con las especificaciones de formato (como JSON, YAML, CSV y texto) y filtro (nombres de máquinas virtuales con el prefijo "test", año de creación posterior a 2015, etc.).

Si desea trabajar con un tutorial interactivo sobre el uso de los indicadores de filtro y formato, inicie el tutorial utilizando el siguiente botón:

Abrir en Cloud Shell

Los siguientes ejemplos muestran usos comunes de formato y filtrado con comandos CLI de gcloud:

Lista de instancias creadas en la zona us-central1-a :

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

Enumere en formato JSON aquellos proyectos donde las etiquetas coinciden con valores específicos (por ejemplo, label.env es 'test' y label.version es alpha):

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

Enumere los proyectos con su fecha y hora de creación especificadas en la zona horaria local:

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

Enumere los proyectos que se crearon después de una fecha específica en formato de tabla:

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

Tenga en cuenta que en el último ejemplo se utilizó una proyección en la clave. El filtro se aplica a la clave createTime después de configurar el formato de fecha.

Enumere una tabla anidada de las cuotas de una región:

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

Imprima una lista aplanada de cuotas globales en formato CSV:

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

Enumere los recursos de instancia de cómputo con decoraciones de cuadro y títulos, ordenados por nombre, en formato de tabla:

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

Enumere la dirección de correo electrónico del usuario autenticado del proyecto:

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

Para conocer ejemplos más detallados de las capacidades de configuración de salida integradas en filters , formats y indicadores projections de gcloud CLI, consulte esta publicación de blog sobre filtrado y formato .

Mejores prácticas

Si desea que un script u otra automatización realice acciones de manera condicional según el resultado de un comando CLI de gcloud, tenga en cuenta lo siguiente:

  • Depende del estado de salida del comando.

    Si el estado de salida no es cero, se produjo un error y la salida podría estar incompleta, a menos que la documentación del comando indique lo contrario. Por ejemplo, un comando que crea varios recursos podría crear solo unos pocos, mostrarlos en la salida estándar y luego salir con un estado distinto de cero. Como alternativa, puede usar la propiedad show_structured_logs para analizar los registros de errores. Ejecute gcloud config para obtener más información.

  • No confíe en los mensajes impresos en el error estándar.

    La redacción de estos mensajes puede cambiar en futuras versiones de gcloud CLI y romper su automatización.

  • No dependa de la salida sin procesar de los mensajes impresos en la salida estándar.

    La salida predeterminada de cualquier comando puede cambiar en una versión futura. Puede minimizar el impacto de estos cambios usando el indicador --format para formatear la salida con uno de los siguientes: --format=json|yaml|csv|text|list para especificar los valores que se devolverán. Ejecute gcloud topic formats para obtener más opciones.

    Puede modificar la salida predeterminada de --format mediante projections . Para mayor granularidad, use el indicador --filter para devolver un subconjunto de los valores según una expresión. Posteriormente, puede crear scripts con esos valores devueltos.

    En la sección siguiente se pueden encontrar ejemplos de formato y filtrado de salida.

Scripts de ejemplo

Al utilizar la funcionalidad de formato y filtro, puede combinar comandos CLI de gcloud en un script para extraer fácilmente información incorporada.

Enumere las claves para todas las cuentas de servicio de sus proyectos

Los siguientes scripts de muestra enumeran las claves asociadas con todas las cuentas de servicio de sus proyectos por:

  • Iterando sobre tus proyectos
  • Para cada proyecto, obtener las cuentas de servicio asociadas
  • Para cada cuenta de servicio, obtener las claves asociadas

Intento

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

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

Analizar la salida para su procesamiento

El siguiente ejemplo muestra el análisis de la salida para su procesamiento. En concreto, el script de ejemplo escribe la información de la cuenta de servicio en una matriz y separa los valores en el campo multivalor serviceAccounts.scope() con 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