Customizando nomes no vRealize Automation 8.x utilizando o ABX

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-PWEB-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!

Deixe um comentário

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