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