Customizando nomes no vRealize Automation 8.x utilizando o ABX
No artigo anterior eu escrevi sobre como customizar nomes no vRealize Automation nativamente. Agora vamos falar sobre algumas exceções. Sabemos que a VMware se esforça para atender todas as necessidades dos clientes, porém, existem algumas particularidades que não conseguimos fazer nativamente no vRA e por isso é necessário o desenvolvimento de código para que a necessidade do cliente seja atendida.
Para esclarecer um pouco mais este tema vamos utilizar o nome CAV-P-WEB-001 como exemplo. A primeira parte (CAV-P-WEB-) é definido por você, pode ser manual ou dinamico baseado em algumas escolhas realizadas no momento da solicitação do item de catalogo. Já a segunda parte, quem faz é o vRA, você só controla a quantidade de números que serão inseridos no nome, neste exemplo são 3 (###).
Neste exemplo, o cliente tem uma necessidade especifica de adicionar uma letra depois dos números em máquinas que são clusters (conjunto de máquinas), ou seja, seguindo o exemplo acima, o nome ficaria CAV-P-WEB-001A, porém, o número das máquinas solicitadas no mesmo deployment precisa ser o mesmo, a unica diferença será a letra.
- O vRA entregaria nativamente os nomes neste formato: CAV-P-WEB-001, CAV-P-WEB-004, CAV-P-WEB-007.
- O cliente precisa que os nomes sejam entregues assim: CAV-P-WEB-001A, CAV-P–WEB-001B, CAV-P-WEB-001C.
Neste caso vamos configurar um cloud template que permita solicitar mais de uma VM simultaneamente e então vamos definir uma subscription que irá chamar um script powershell ABX (Action Based Extensibility). Mas calma aí, vamos por partes, como diria Jack 🙂
Vamos começar pelo cloud template. Neste exemplo ele será super simples.
formatVersion: 1
inputs:
cavCount:
type: number
title: Instâncias
description: Selecione a quantidade de instâncias (VMs)
default: 2
minimum: 1
maximum: 26
# selecionar o ambiente
cavAmbiente:
type: string
title: Ambiente
description: Selecione o ambiente
default: T
oneOf:
- title: Teste
const: T
# selecionar o servico do server
cavApptype:
type: string
title: Serviço
description: Selecione o serviço do servidor
default: APP
oneOf:
- title: Application
const: APP
- title: Database
const: DB
- title: Web Server
const: WEB
#---------------------------------------------------
resources:
vSphere_Machine:
type: Cloud.vSphere.Machine
properties:
count: ${input.cavCount}
name: ${'CAV-' + (input.cavAmbiente) + '-' + (input.cavApptype) + '-'}
image: Ubuntu 22.04
flavor: Small
customizationSpec: vRA-Linux
cavAmbiente: ${input.cavAmbiente}
cavApptype: ${input.cavApptype}
cluster: sim # usado pela subscription
constraints:
- tag: compute:compute-vsan
networks:
- network: ${resource.vSphere_Network.id}
assignment: static
storage:
constraints:
- tag: storage:tier1
vSphere_Network:
type: Cloud.vSphere.Network
properties:
networkType: existing
constraints:
- tag: network:vmnet_100
#---------------------------------------------------
Agora vamos ver como ficaria o código em si. Basicamente o código precisa obter o nome que o vRA irá definir para a primeira VM e usa-lo como prefixo (ex: CAV-P-WEB-001), depois basta contabilizar a quantidade de VMs solicitadas e fazer prefixo + letra (ex: CAV-P-WEB-001A e CAV-P-WEB-001B). É exatamente isso que o IF faz. O ELSE é responsável pela atualização do deployment, ou seja, eu já tenho 2 VMs no deployment (A e B), a ideia é que eu possa adicionar mais uma VM e o nome automaticamente seja CAV-P-WEB-001C, D, E e assim sucessivamente. Não sou desenvolvedor, mas não vou mentir, fiquei orgulhoso deste código haha
Lembrando que desenvolvi em powershell porque é o que tenho mais afinidade, o vRA suporta nodejs, python e javascript.
function Handler($context, $inputs) {
$inputsString = $inputs | ConvertTo-Json -Compress
$letras = 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' # 26
$outputs = $inputs
if ($inputs.customProperties.clusterNodes -eq $null) { # novo deployment
write-host "### NEW DEPLOYMENT"
$vmsCluster = $inputs.resourceNames # recebe os nomes do deployment
$prefixo = $inputs.resourceNames[0] # define o nome da primeira VM do deployment como prefixo para as outras
$outputs.customProperties.clusterPrefix = $prefixo # adiciona o prefixo no campo PREFIXO no deployment
$outputs.customProperties.clusterNodes = $vmsCluster.count # altera a quantidade de nodes do cluster no campo CLUSTERNODES no deployment
for ($i = 0; $i -ne $vmsCluster.count; $i++) {
$nomeFinal = $prefixo + $letras[$i] # monta o nome final
$outputs.resourceNames[$i] = $nomeFinal # altera o nome no depoyment
write-host "- Novo membro do cluster $prefixo criado :" $outputs.resourceNames[$i]
}
write-host "- Total de membros do cluster $prefixo :" $outputs.customProperties.clusterNodes
}
else { # atualiza o deployment
write-host "### UPDATE DEPLOYMENT"
$vmsCluster = $inputs.resourceNames # recebe o nome do deployment
$clusterPrefix = $inputs.customProperties.clusterPrefix # recebe o prefixo do deployment
$clusterNodes = $inputs.customProperties.clusterNodes # recebe a quantidade existente de nodes do deployment
$clusterNewNodes = $inputs.customProperties.count # recebe a quantidade de nodes do deployment (nova solicitacao)
$ii = [int]$clusterNodes # index para as letras
for ($i = 0; $i -ne $vmsCluster.count; $i++) { # looping para as VMs
$nomeFinal = $clusterPrefix + $letras[$ii] # monta o nome final
$outputs.resourceNames[$i] = $nomeFinal # altera o nome no depoyment
$outputs.customProperties.clusterNodes = $clusterNewNodes # altera a quantidade de nodes do cluster no campo CLUSTERNODES no deployment
write-host "- Novo membro do cluster $clusterPrefix criado :" $outputs.resourceNames[$i]
$ii++
}
write-host "- Novos membros adicionados ao cluster $clusterPrefix :" $vmsCluster.count
write-host "- Total de membros do cluster $clusterPrefix :" $outputs.customProperties.clusterNodes
}
return $outputs
}
Por fim basta configurar a subscription, ou seja, o gatilho para o script ser acionado. Aqui vamos utilizar compute allocation como event topic, a condição será esta event.data[“customProperties”][“cluster”] == “sim”, selecione a action (script) criada anteriormente, marque a opção de blocking e clique em salvar.
Defini a condição baseado a definição que fizemos no cloud template (cluster: sim), mas poderia ser o ID do cloud template ou qualquer outra coisa que relacione com o cloud template que você deseja.
Pronto, agora todos os cloud templates e/ou itens de catalogo com a opção cluster: sim irá acionar a subscription que por sua vez irá executar o script que criamos.
Agora vamos adicionar mais uma VM no deployment ConzaTech Cluster e a expectativa é que esta VM fique com o nome CAV-T-WEB-197C.
Por hoje é isso, pessoal. Até a próxima!





