Cómo ejecutar secuencias de comandos de gcloud

Además de ejecutar comandos de gcloud de la línea de comandos, también puedes ejecutarlos desde las secuencias de comandos o desde otras automatizaciones, por ejemplo, cuando usas Jenkins para automatizar las tareas de Google Cloud Platform.

Autorización

El SDK de Google Cloud es compatible con dos métodos de autorización:

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

Se recomienda la autorización de la cuenta de usuario si estás ejecutando una secuencia de comandos o cualquier otra automatización en una sola máquina.

Para autorizar el acceso y realizar otros pasos comunes de configuración del SDK de Cloud:

    gcloud init

Se recomienda la autorización de la cuenta de servicio si estás implementando una secuencia de comandos o cualquier otra automatización en distintas máquinas en un entorno de producción. También es el método de autorización recomendado si estás ejecutando comandos de gcloud en una instancia de máquina virtual de Google Compute Engine en la que todos los usuarios tienen acceso a root.

Para usar la autorización de la cuenta de servicio, usa una cuenta de servicio existente o crea una nueva a través de Google Cloud Platform Console. Desde la columna de opciones de la tabla de cuentas de servicio, crea y descarga la clave privada asociada como un archivo de claves con formato JSON.

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

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

Puedes establecer una conexión SSH a tu instancia de VM usando gcloud compute ssh, que se ocupa de la autenticación. Los archivos de configuración de SSH se pueden configurar usando gcloud compute config-ssh.

Para obtener instrucciones detalladas sobre la autorización de herramientas del SDK de Cloud, consulta esta guía integral.

Cómo inhabilitar mensajes

Algunos comandos de gcloud son interactivos: les piden a los usuarios que confirmen una operación o les solicitan una entrada adicional para un comando ingresado.

En la mayoría de los casos, esto no es conveniente cuando se ejecutan comandos en una secuencia de comandos o cualquier otra automatización. Puedes inhabilitar los mensajes de los comandos de gcloud estableciendo la propiedad disable_prompts en tu configuración en True o usando la marca global --quiet o -q. La mayoría de los comandos interactivos tienen valores predeterminados cuando se requiere una entrada o una confirmación adicional. Si se inhabilitan los mensajes, se usan estos valores predeterminados.

Por ejemplo:

    gcloud --quiet debug targets list

Ten en cuenta que la marca --quiet se ingresa justo en la parte delantera.

Cómo manejar los resultados

Si deseas que una secuencia de comandos o cualquier otra automatización realice acciones condicionalmente basadas en el resultado de un comando de gcloud, observa lo siguiente:

  • No dependas de los mensajes impresos para error estándar.

    Estos pueden cambiar en versiones futuras de gcloud y romper tu automatización.

  • No dependas de los resultados sin procesar de mensajes impresos para resultado estándar.

    El resultado predeterminado de cualquier comando puede cambiar en actualizaciones futuras. Puedes minimizar el impacto de esos cambios mediante la marca --format para darle formato al resultado con una de las siguientes opciones: --format=json|yaml|csv|text|list para especificar valores que se mostrarán. Ejecuta formatos de tema $ gcloud para obtener más opciones.

    Puedes modificar el resultado predeterminado de --format con projections. Para obtener un nivel de detalle mayor, usa la marca --filter para mostrar un subconjunto de valores basado en una expresión. Luego, puedes ejecutar la secuencia de comandos contra esos valores mostrados.

    Puedes encontrar ejemplos de resultados de formato y filtro en la sección a continuación.

  • Depende del estado de salida del comando.

    Si el estado de salida no es cero, hubo un problema, y el resultado puede estar incompleto salvo que la documentación del comando señale lo contrario. Por ejemplo, un comando que crea múltiples recursos solo podría crear algunos, enumerarlos en el resultado estándar y luego salir con un estado que no es cero. Como alternativa, puedes usar la propiedad show_structured_logs para analizar registros de error. Ejecuta $ gcloud config para obtener más detalles.

Ejemplos de filtrado y formateo

Para trabajar con un instructivo interactivo sobre el uso de las marcas de formato y filtro, inicie el instructivo mediante el botón a continuación:

Abrir en Cloud Shell

Los siguientes son ejemplos de usos comunes de filtrado y formateo con comandos de gcloud:

Enumera instancias creadas en la zona us-central1-a:

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

Enumera en formato JSON aquellos proyectos en los que las etiquetas coinciden con valores específicos (p. ej., label.env es 'prueba' y label.version es alfa):

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

Enumera 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))"

Enumera proyectos que se crearon luego 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'"

Ten en cuenta que, en el último ejemplo, se usó una proyección en la clave. El filtro se aplica en la clave createTime luego de que se establece el formato de fecha.

Muestra una tabla anidada de las cuotas de la región:

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

Imprime una lista plana de cuotas globales en formato CSV:

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

Enumera los recursos de las instancias de procesamiento con títulos y decoraciones de cuadro, ordenados por nombre, en formato de tabla:

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

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

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

Ejemplos de secuencia de comandos

Usando esta funcionalidad de formato y filtro, puedes combinar los comandos de gcloud en una secuencia de comandos para extraer fácilmente información incorporada.

Si tuvieras que hacer una lista con todas las claves asociadas con todas las cuentas de servicio de tus proyectos, necesitarías iterar todos tus proyectos y, para cada proyecto, obtener todas las cuentas de servicio asociadas a él. Para cada cuenta de servicio, obtén todas las claves. Esto se puede lograr de la siguiente manera:

Como una secuencia de comandos de 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

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

A menudo, tendrás que analizar los resultados para su procesamiento. Por ejemplo, sería útil escribir la información de la cuenta de servicio en un arreglo y segregar los valores en el campo serviceAccounts.scope() de múltiples valores con formato CSV. La siguiente secuencia de comandos hace esto:

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

Más información

Para obtener una guía paso a paso sobre cómo compilar secuencias de comandos básicas con gcloud, consulta esta guía para principiantes sobre cómo automatizar tareas de GCP.

Puedes encontrar más ejemplos relacionados de las posibilidades de configuración de resultados creados en gcloud filters, formats y projections en esta entrada de blog sobre filtrado y formateo.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Documentación del SDK de Cloud