Exemplo de como utilizar chamadas REST API nas actions do Orchestrator – Python

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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *