Demonstração da API do Veeam B&R no Aria Automation – Parte 1
Hoje vamos falar sobre a API do Veeam Backup & Replication, especificamente como utiliza-la em conjunto com o Aria Automation para criarmos automações interessantes. A necessidade do cliente era bem simples e clara: toda vez que um usuário solicitasse a remoção de uma máquina produtiva no portal do Aria Automation, uma automação de backup no Veeam seria acionada fazendo um último backup da máquina com retenção de 30 dias. Após o backup ser concluido com sucesso, então a máquina virtual seria removida.
A ideia aqui é demonstrar como eu construi esta automação passo a passo. Antes de mais nada, vamos ver um resumo das automações que foram necessárias para atingir o objetivo em questão:
- Obter o token do Veeam B&R;
- Criar um job de backup baseado na máquina que será removida;
- Iniciar o job de backup;
- Garantir que o job de backup foi executado com sucesso;
- Se houve sucesso na execução do job, então remover a máquina virtual, caso contrário, deletar o job e não remover a máquina.
Abaixo temos uma imagem do workflow principal (chamado de Veeam Last Chance) para entendermos com detalhes do que estou falando.
Lembre-se que esta automação é uma demonstração e/ou um caso de uso especifico. Você pode usar a base e adequar para o seu uso. Por exemplo: é possível, com o uso do Enterprise Manager, não criar um job de backup, mas sim utilizar o VeeamZIP (a chamada REST API seria para o Enterprise Manager e não para o B&R). Outro exemplo poderia ser sobre remover o job de backup independentemente do backup ter sucesso ou não, facilitando assim a vida do time que administra a solução de backup. Enfim, existem infinitas possibilidades e tudo está baseado na necessidade 🙂
Ah, tudo o que eu usei foi a documentação oficial REST API Reference e foi bem tranquilo encontrar as chamadas, seguir os exemplos e etc.
Olhando a imagem acima, deve ter ficado claro que são vários workflows que estão dentro de um workflow principal. Recomendo criar e testar os workflows individualmente antes de seguir para o próximo. Desta forma, é possível garantir que está funcionando adequadamente.
Então vamos lá. Começando com o workflow de autenticação. Neste caso, o objetivo é obter o token do Veeam B&R utilizando a credencial. Este token será usado em todos os outros workflows, ele será a nossa autenticação para as chamadas REST API. A validade deste token é de exatamente 60 minutos.
var body = "grant_type=password&username=" + veeamUser + "&password=" + veeamPass; var operation = "/api/oauth2/token"; var method = "POST"; var request = veeamRestHost.createRequest(method, operation, body); request.setHeader("x-api-version", veeamApiVersion); request.setHeader("Content-Type", "application/x-www-form-urlencoded"); request.setHeader("Accept", "application/json"); var response = request.execute(); var content = JSON.parse(response.contentAsString); if (content.access_token) { veeamToken = content.token_type + " " + content.access_token; System.log("### VEEAM B&R TOKEN - SUCCESS"); } else { System.log("### VEEAM B&R TOKEN - FAIL | CODE: " + response.statusCode + " | DETAILS: " + response.contentAsString); }
Se o workflow do token está funcionando corretamente, então podemos seguir para o próximo. Agora iremos criar o workflow que cria um job de backup no Veeam B&R. Aqui é esperado como input, um objeto do tipo máquina virtual do vCenter (VC:VirtualMachine), contendo as informações da máquina que será removida. É possível obter estas informações usando o UUID e External IDs a partir do Aria Automation. Algo similar a isso:
vcUuid = inputProperties.customProperties.vcUuid; externalIds = inputProperties.externalIds[0]; vm = System.getModule("com.vmware.vra.xaas").findVcVmByVcAndVmUuid(vcUuid,externalIds);
Observe a imagem abaixo. Atente-se aos inputs e outputs de todos os workflows. Eles são fundamentais para garantir que tudo funcione corretamente.
var jobName = vm.name + " - LAST CHANCE"; var jobDesc = "Aria Automation - Last backup of VM " + vm.name + " before removal. Retention of 30 days. Removed by " + userName; var VmObjectName = vm.name; var VmObjectId = vm.id; var vcenterName = vm.sdkId.split("/")[0]; var body = { "name": jobName, "description": jobDesc, "type": "Backup", "isHighPriority": false, "virtualMachines": { "includes": [ { "type": "VirtualMachine", "hostName": vcenterName, "name": VmObjectName, "objectId": VmObjectId, "platform": "VMware" } ] }, "storage": { "backupRepositoryId": "88788f9e-d8f5-4eb4-bc4f-9b3f5403bcec", "backupProxies": { "autoSelectEnabled": true }, "retentionPolicy": { "type": "Days", "quantity": 30 }, "gfsPolicy": { "isEnabled": false } }, "guestProcessing": { "appAwareProcessing": { "isEnabled": false }, "guestFSIndexing": { "isEnabled": false }, "guestInteractionProxies": { "autoSelectEnabled": true } }, "schedule": { "runAutomatically": false } }; var operation = "/api/v1/jobs/"; var method = "POST"; var request = veeamRestHost.createRequest(method, operation, JSON.stringify(body)); request.setHeader("x-api-version", veeamApiVersion); request.setHeader("Content-Type", "application/json"); request.setHeader("Accept", "application/json"); request.setHeader("Authorization", veeamToken); var response = request.execute(); var content = JSON.parse(response.contentAsString); if (content.id) { veeamJobId = content.id; System.log("### VEEAM B&R CREATE JOB - SUCCESS"); } else { System.log("### VEEAM B&R CREATE JOB - FAIL | CODE: " + response.statusCode + " | DETAILS: " + response.contentAsString); }
Lembre-se que algumas informações que estão dentro da variável body são relacionadas com o meu ambiente. Por exemplo: o valor do campo backupRepositoryId. Por isso, o melhor é criar um job de teste, fazer um GET nele e obter estas informações para ajudar no seu workflow.
Recomendo fortemente que antes de seguir, você garanta que é possível se autenticar no Veeam V&R e criar um job de backup. Se isso estiver acontecendo, na segunda parte deste artigo daremos continuidade as demais configurações.
Até mais!