OCI – Script para gerar relatório de backups

Decidi criar esse script para auxiliar no monitoramento dos backups dos discos do OCI, com ele fica bem simples fazer um agendamento por exemplo e receber todos os dias um relatório de como estão seus backups, dessa forma você vai poder receber um alerta caso existam discos sem backup.

Abaixo explico os pedaços do código e no final disponibilizo o código completo.

Requisitos

  • Servidor Linux no OCI dentro de um dynamic group para fazer as chamadas via cli
  • Utilitário mutt instalado e configurado no servidor para envio de e-mail
  • OCID do compartimento onde os discos estão
  • “Nome” do AD onde os discos estão
  • oci-cli instalado e configurado

Funções

Como já disse, o script é bem simples, ele é dividido basicamente entre listar os discos, fazer um loop no ocids buscando os backups e montar o e-mail.

Gerando os ocids

Essas duas funções recebem como parâmetros o AD e também o ocid do compartimento a ser analisado, a primeira busca o ocid e o display-name dos boot volumes enquanto que a segunda faz a mesma coisa para os block volumes:

list_boot_vol() {
    oci bv boot-volume list --availability-domain ${OCI_AD} -c ${OCI_COMPARTMENT} | jq -r '.data[] | [(.id+","+."display-name")] | @tsv' >boot-vol.txt
}
list_block_vol() {
    oci bv volume list -c ${OCI_COMPARTMENT} | jq -r '.data[] | [(.id+","+."display-name")] | @tsv' >block-vol.txt
}

Verificação de backups de boot volume

Nessa parte começo a montar o e-mail(coloquei um pouco de CSS para não ficar tão simples) e a parte importante é esse loop que para cada ocid identificado, ele faz um requisição buscando seus backups.

while IFS=',' read -r disk_id disk_name; do
        list_disk=$(oci bv boot-volume-backup list -c ${OCI_COMPARTMENT} --boot-volume-id ${disk_id} |
            jq -r '.data[] | [("<tr><td class=\"tg-0pky\">"+."display-name"+"</td><td class=\"tg-0pky\">"+."time-created"+"</td><td class=\"tg-0pky\">"+."expiration-time"+"</td><td class=\"tg-0pky\">"+."lifecycle-state"+"</td></tr>")]|@tsv')
        if [ $(echo -n "$list_disk" | wc -l) != 0 ]; then
            echo "<div class=\"card\"><div class=\"card-body\"><div class=\"alert alert-success\" role=\"alert\"><p><b>Disco:</b> $disk_name <br><b>OCID:</b> $disk_id <br><b>Quantidade de backups:</b> $(echo "$list_disk" | wc -l)</p></div>" >>mail.html
            echo "<table class=\"tg\">
            <tr>
              <th class=\"tg-0pky\">Backup</th>
              <th class=\"tg-0pky\">Criado em</th>
              <th class=\"tg-0pky\">Expira em</th>
              <th class=\"tg-0pky\">Status</th>
            </tr>
          </thead>
        <tbody>$list_disk</tbody>
        </table></div></div>" >>mail.html
        else
            echo "<div class=\"card\"><div class=\"card-body\"><p class=\"alert alert-danger\" role=\"alert\"> <b>Disco:</b> $disk_name <br><b style=\"color:red;\">OCID:</b> $disk_id <br><b style=\"color:red;\">Quantidade de backups:</b> $(echo -n "$list_disk" | wc -l)</p></div></div><br>" >>mail.html
        fi
done <boot-vol.txt

Baseado no arquivo boot-vol que geramos no passo anterior, um loop é executado verificando se existe ou não o backup, caso existam backups, o texto recebe um fundo verde e uma tabela é gerada com os backups registrados, caso não seja encontrado nenhum backup o texto recebe um fundo vermelho:

Os backups realizados sob demanda aparecem sem data de expiração, isso também é bom para caso você tenha esquecido algum backup fora da politica padrão.

Para ambas as opções, além do nome do disco também retorno o ocid para caso precise usar a barra de pesquisa do OCI para encontrar o disco e aplicar a politica de backup nele.

Verificação de backups de block volumes

A mesma ideia é aplicada aos backups de block volumes que estão no arquivo block-vol.txt e aqui encerramos o nosso e-mail:

 while IFS=',' read -r disk_id disk_name; do
        list_disk=$(oci bv backup list -c ${OCI_COMPARTMENT} --volume-id ${disk_id} | jq -r '.data[] | [("<tr><td>"+."display-name"+"</td><td>"+."time-created"+"</td><td>"+."expiration-time"+"</td><td>"+."lifecycle-state"+"</td></tr>")]|@tsv')
        if [ $(echo -n "$list_disk" | wc -l) != 0 ]; then
            echo "<div class=\"card\"><div class=\"card-body\"><div class=\"alert alert-success\" role=\"alert\"><p><b>Disco:</b> $disk_name <br><b>OCID:</b> $disk_id <br><b>Quantidade de backups:</b> $(echo "$list_disk" | wc -l)</p></div><br>" >>mail.html
            echo "<table class=\"tg\">
                  <tr>
                    <th class=\"tg-0pky\">Backup</th>
                    <th class=\"tg-0pky\">Criado em</th>
                    <th class=\"tg-0pky\">Expira em</th>
                    <th class=\"tg-0pky\">Status</th>
                  </tr>
                </thead>
                <tbody>$list_disk</tbody>
                </table></div></div>" >>mail.html
        else
            echo "<div class=\"card\"><div class=\"card-body\"><p class=\"alert alert-danger\" role=\"alert\"> <b>Disco:</b> $disk_name <br><b>OCID:</b> $disk_id <br><b>Quantidade de backups:</b> $(echo -n "$list_disk" | wc -l) </p></div></div><br>" >>mail.html
        fi
    done <block-vol.txt
    echo "<figure class=\"text-center\"><p class=\"h6\">Lista de discos e seus backups no compartimento $COMPARTMENT_NAME gerado em $DATA $HORA</p></figure>" >>mail.html
    echo "</body></html>" >>mail.html

Email

Todos os resultados são salvos em um arquivo chamado mail.html no diretório onde o script está sendo executado e ele vira o corpo do nosso e-mail:

send_mail() {
    cat mail.html | mutt -e "set content_type=text/html" -e " my_hdr From:bkp-report" -s "Backups do compartimento $COMPARTMENT_NAME $DATA" $EMAIL
}

Preferi fazer dessa forma(apesar de perdemos um pouco a formatação no corpo do e-mail) pois alguns provedores podem acabar bloqueando anexos do tipo html.

Executando

A execução do script é bem simples e para isso só precisamos passar o nome do AD onde os discos estão, o ocid do compartimento, nome do compartimento e para qual e-mail deve ser enviado:

./bkp-report.sh cEcK:SA-SAOPAULO-1-AD-1 ocid1.compartment.oc1..aXXXXXX COMPARTIMENTO_XYZ email@gmail.com

Você também pode fazer um agendamento no crontab para receber diariamente o relatório

30 03 * * * bkp-report.sh cEcK:SA-SAOPAULO-1-AD-1 ocid1.compartment.oc1..aXXXXXX COMPARTIMENTO_XYZ email@gmail.com

Considerações

  • Dependendo da quantidade de discos no ambiente, o script pode demorar muito para finalizar sua execução, você pode acompanhar o status dando um tail no arquivo mail.html
  • Enviar html no corpo do e-mail não é uma coisa tão simples, nas minhas primeiras tentativas eu consegui criar um layout bem melhor mas ele não era respeitado, por isso alguns erros de posicionamento podem ocorrer
  • Estou ajustando uma versão que ao invés de gerar o arquivo html e enviar por e-mail, vai criar um arquivo csv que pode ser aberto no excel para facilitar por exemplo a criação de gráficos ou algo do tipo

O código completo pode ser encontrado no meu github -> https://github.com/adrianotanaka/scripts/blob/master/oci/cli/bkp-report.sh

chevron_left
chevron_right