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!


