Criar scripts de comandos da CLI gcloud

Além de executar comandos da CLI Google Cloud a partir da linha de comandos, pode executá-los a partir de scripts ou outras automatizações, por exemplo, quando usa o Jenkins para acionar a automatização de Google Cloud tarefas.

O Google Cloud SDK inclui várias ferramentas, como a filtragem, a formatação e a flag --quiet, que lhe permitem processar eficazmente a saída e automatizar tarefas.

Noções básicas de criação de scripts com o SDK Cloud da Google

Para um guia passo a passo sobre a criação de scripts básicos com a CLI gcloud, consulte esta publicação no blogue: Criação de scripts com a gcloud: um guia para principiantes sobre a automatização de tarefas Google Cloud .

Autorização

Quando cria scripts com o Google Cloud SDK, tem de considerar os métodos de autorização. O SDK Google Cloud oferece duas opções:

  • Autorização da conta de utilizador
  • Autorização da conta de serviço

A autorização da conta de utilizador é recomendada se estiver a executar um script ou outra automatização numa única máquina.

Para autorizar o acesso e realizar outros passos comuns de configuração do SDK Cloud da Google:

gcloud init

A autorização da conta de serviço é recomendada se estiver a implementar um script ou outra automatização em várias máquinas num ambiente de produção. Também é o método de autorização recomendado se estiver a executar comandos da CLI gcloud numa instância de máquina virtual do Compute Engine em que todos os utilizadores têm acesso a root.

Para usar a autorização da conta de serviço, use uma conta de serviço existente ou crie uma nova na página Contas de serviço:

Aceda à página Contas de serviço

Para criar e transferir a chave privada associada como um ficheiro de chave formatado em JSON, escolha Gerir chaves no menu de ações da conta de serviço.

Para executar a autorização, execute o comando gcloud auth activate-service-account:

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

Pode entrar na sua instância de VM através de SSH com o comando gcloud compute ssh, que se encarrega da autenticação. Pode configurar os ficheiros de configuração SSH com gcloud compute config-ssh.

Para ver instruções detalhadas sobre a autorização de ferramentas do Google Cloud SDK, consulte o artigo Autorizar a CLI gcloud.

Desativar comandos

Alguns comandos da CLI gcloud são interativos, pedindo aos utilizadores a confirmação de uma operação ou solicitando informações adicionais para um comando introduzido.

Na maioria dos casos, isto não é desejável quando executa comandos num script ou noutra automatização. Pode desativar os comandos da CLI gcloud que pedem autorização definindo a propriedade disable_prompts na sua configuração como True ou usando a flag global --quiet ou -q. A maioria dos comandos interativos tem valores predefinidos quando é necessária uma confirmação ou uma entrada adicional. Se as mensagens estiverem desativadas, são usados estes valores predefinidos.

Por exemplo:

gcloud debug targets list --quiet

Filtrar e formatar a saída

Para criar scripts com a CLI gcloud, é importante ter um resultado previsível. É aqui que as flags --filter e --format ajudam. Garantem que, quando executa um comando através da CLI gcloud, este produz resultados que cumprem as suas especificações de formato (como json, yaml, csv e texto) e de filtro (nomes de VMs com o prefixo "test", ano de criação posterior a 2015, etc.).

Se quiser seguir um tutorial interativo sobre a utilização dos flags de filtro e de formato, inicie o tutorial através do seguinte botão:

Abra no Cloud Shell

Os exemplos seguintes mostram utilizações comuns da formatação e filtragem com comandos da CLI gcloud:

Liste as instâncias criadas na zona us-central1-a:

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

Apresente numa lista em formato JSON os projetos em que as etiquetas correspondem a valores específicos (por exemplo, label.env é "test" e label.version é alfa):

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

Liste os projetos com a respetiva data e hora de criação especificadas no fuso horário local:

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

Apresentar projetos criados após uma data específica no formato de tabela:

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

Tenha em atenção que, no último exemplo, foi usada uma projeção na chave. O filtro é aplicado na chave createTime após a definição da formatação de data.

Apresentar uma tabela aninhada das quotas de uma região:

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

Imprima uma lista simples de quotas globais no formato CSV:

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

Apresenta os recursos de instâncias de computação com decorações de caixas e títulos, ordenados por nome, no formato de tabela:

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

Indique o endereço de email do utilizador autenticado do projeto:

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

Para ver exemplos mais complexos das capacidades de configuração de saída incorporadas nas flags filters, formats e projections da CLI gcloud, consulte esta publicação no blogue acerca da filtragem e formatação.

Práticas recomendadas

Se quiser que um script ou outra automatização execute ações condicionalmente com base no resultado de um comando da CLI gcloud, tenha em atenção o seguinte:

  • Dependa do estado de saída do comando.

    Se o estado de saída não for zero, ocorreu um erro e a saída pode estar incompleta, a menos que a documentação do comando indique o contrário. Por exemplo, um comando que cria vários recursos pode criar apenas alguns, listá-los na saída padrão e, em seguida, sair com um estado diferente de zero. Em alternativa, pode usar a propriedade show_structured_logs para analisar registos de erros. Execute gcloud config para ver mais detalhes.

  • Não dependa de mensagens impressas no erro padrão.

    A redação destas mensagens pode mudar em versões futuras da CLI gcloud e interromper a sua automatização.

  • Não dependa do resultado não processado das mensagens impressas no resultado padrão.

    A saída predefinida de qualquer comando pode mudar numa versão futura. Pode minimizar o impacto dessas alterações usando a flag --format para formatar o resultado com uma das seguintes opções: --format=json|yaml|csv|text|list para especificar os valores a devolver. Execute gcloud topic formats para ver mais opções.

    Pode modificar a saída predefinida de --format através de projections. Para aumentar a granularidade, use a flag --filter para devolver um subconjunto dos valores com base numa expressão. Em seguida, pode criar scripts com base nesses valores devolvidos.

    Pode encontrar exemplos de formatação e filtragem da saída na secção abaixo.

Exemplos de guiões

Usando a funcionalidade de formatação e filtragem, pode combinar comandos da CLI gcloud num script para extrair facilmente informações incorporadas.

Apresente uma lista das chaves de contas de serviço de todos os seus projetos

Os seguintes scripts de exemplo listam as chaves associadas a todas as contas de serviço dos seus projetos através do seguinte:

  • Iterar os seus projetos
  • Para cada projeto, obter as contas de serviço associadas
  • Para cada conta de serviço, obter as chaves associadas

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

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

Analise o resultado para processamento

O exemplo seguinte demonstra a análise da saída para processamento. Em particular, o script de exemplo escreve as informações da conta de serviço numa matriz e segrega os valores no campo serviceAccounts.scope() com formato CSV de vários valores:

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