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!