Exemplo de como utilizar chamadas REST API nas actions do Orchestrator – Python
Update 30/11/2023: embora o conteúdo deste artigo continue válido, eu prefiro utilizar o formato descrito neste artigo.
Hoje vamos ver alguns exemplos de como utilizar as APIs do vRA para chamar o próprio vRA, vCenter, vROps e phpIPAM em conjunto com as actions do Orchestrator e Python para exibir informações em menus suspensos dinamicamente. O resultado final será a action trazendo informações para o usuário escolher dentro de um item de catálogo do vRA. Existem milhares de aplicações para isso, pense nas escolhas básicas para criar alguma coisa: rede de uma VM, cluster de um vCenter, grupos de recurso do Azure, ordens de serviço de um sistema e etc.
Algumas observações antes de iniciarmos:
- Aqui estou falando das actions que ficam dentro do Orchestrator que está embutido no vRA (dentro do vRA > Services > Orchestrator > Library > Actions)
- NUNCA utilize os códigos com a senha exposta em ambientes produtivos (opte por variáveis, secrets, custom form ou qualquer outra estratégia de sua preferência)
- Não sou desenvolvedor e os códigos são apenas exemplos simples, adapte e otimize-os conforme a sua necessidade
Dito isso, vamos começar configurando o ambiente no Orchestrator. Navegue até Environments (Services > Orchestrator > Assets). Clique em New Environment, defina um nome, selecione Python 3.7 (ou similar) como runtime environment e 128MB de memory limit (ajuste baseado no seu ambiente). Nas dependências adicione o requests e a versão 2.28.0 (ou similar) e clique em create.
Valide os logs para garantir que a dependência foi baixada corretamente.
Importante: utilizar latest como versão não funciona, mas ajuda a saber quais versões estão disponíveis 🙂
Com o ambiente já preparado, vamos configurar a action para receber o código Python. Navegue até Actions (Services > Orchestrator > Library), crie uma nova action, em script selecione o runtime environment que acabou de criar e em return type garanta que a opção array esteja habilitada (todos os exemplos utilizados aqui retornam múltiplos valores, por isso a saida precisa ser um array. Isso pode não se aplicar para outros casos).
Shooooooooow me the code! Agora que o básico foi configurado, basta copiar o código, alterar com as informações do seu ambiente e salvar.
vRealize Automation (Aria Automation)
Neste exemplo são exibidos todos os deployments do vRA (info sobre API).
import requests import json def handler(context, inputs): server = "https://vra-server.domain" # URL do vRA username = "usuario" # usuário do vRA (sem @domain) password = "S$nh@S3gur@123" # senha do usuário # fresh token res = requests.post(server + '/csp/gateway/am/api/login?access_token', verify=False, headers={'Content-Type': 'application/json'}, json={'username': username, 'password': password}) token = json.loads(res.content)['refresh_token'] # bearer token res2 = requests.post(server + '/iaas/api/login', verify=False, headers={'Content-Type': 'application/json'}, json={'refreshToken': token}) token2 = json.loads(res2.content) bearer = token2['tokenType'] + " " + token2['token'] # vRA deployments res3 = requests.get(server + '/deployment/api/deployments/', verify=False, headers={'Content-Type': 'application/json', 'Authorization': bearer}) deployments = json.loads(res3.content)['content'] result = [] i = 0 while (len(deployments) > i): print(deployments[i]['name']) # log result.append(deployments[i]['name']) i = i+1 return result
vCenter Server
Neste exemplo são exibidas todas as VMs do vCenter (info sobre API).
import requests import json def handler(context, inputs): server = "https://vcenter-server.domain" # URL do vCenter username = "usuario@domain" # usuário do vCenter (com @domain) password = "S$nh@S3gur@123" # senha do usuário baseurl = server + "/api" # token res = requests.post(baseurl + '/api/session', verify=False, auth=(username, password)) token = json.loads(res.content) # VMs res2 = requests.get(baseurl + '/api/vcenter/vm/', verify=False, headers={'vmware-api-session-id': token}) vms = json.loads(res2.content) result = [] i = 0 while (len(vms) > i): print(vms[i]['name']) # log result.append(vms[i]['name']) i = i+1 return result
vRealize Operations (Aria Operations)
Neste exemplo são exibidas todos os tipos de adapters do vROps (info sobre API).
import requests import json def handler(context, inputs): vropsServer = "https://vrops-server.domain/suite-api" # URL do vROps (/suite-api) vropsUser = "admin" # usuário do vROps (sem @domain) vropsPass = "S$nh@S3gur@123" # senha do usuário # token res1 = requests.post(vropsServer + '/api/auth/token/acquire', verify=False, headers={'Content-Type': 'application/json', 'Accept': 'application/json'}, json={'username': vropsUser, 'password': vropsPass}) token = json.loads(res1.content)['token'] # adapter kinds res2 = requests.get(vropsServer + '/api/adapterkinds', verify=False, headers={'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': 'vRealizeOpsToken ' + token}) adapter = json.loads(res2.content)['adapter-kind'] result = [] i = 0 while (len(adapter) > i): print(adapter[i]['name']) # log result.append(adapter[i]['name']) i = i+1 return result
phpIPAM
Neste exemplo são exibidas todas as redes cadastradas no phpIPAM (info sobre API).
import requests import json def handler(context, inputs): server = "https://phpipam-server.domain" # URL do phpIPAM appid = "vra" # App ID do phpIPAM username = "admin" usuário do phpIPAM (sem @domain) password = "S$nh@S3gur@123" # senha do usuário baseurl = server + "/api/" + appid # token res = requests.post(baseurl + '/user/', verify=False, auth=(username, password)) token = json.loads(res.content)['data']['token'] # subnets res2 = requests.get(baseurl + '/subnets', verify=False, headers={'token': token}) subnets = json.loads(res2.content)['data'] result = [] i = 0 while (len(subnets) > i): print(subnets[i]['subnet']) # log result.append(subnets[i]['subnet']) i = i+1 return result
Não faz muito sentido colocar estas actions simplesmente “soltas” no mesmo blueprint, então entenda isso como uma ilustração. Fiz a associação da action com o blueprint utilizando o custom form.
Quando o item de catálogo é aberto, as actions começam trabalhar para trazer as informações para os menus suspensos. Pode levar mais ou menos tempo dependendo da complexidade das actions. Aqui levou um ou dois segundos apenas.
Lindo demais, até me emociono haha 🙂
É isso aí, pessoal. Até a próxima!
Apenas para esclarecer: VMware Aria Automation é o novo nome do vRealize Automation. Aqui, para fins didáticos, continuo utilizando o termo vRA.