vRA – Cloud Template 101 – Opções de escolha de rede
Após implantar o VMware vRealize Automation e fazer as configurações iniciais, chegamos no momento de configurar os cloud templates e nesta série quero compartilhar alguns exemplos interessantes do que podemos fazer. Provavelmente uma das primeiras coisas que as pessoas querem fazer é fornecer opções de escolha de rede e neste artigo vou mostrar algumas formas de fazer isso.
A forma mais rápida e simples de fornecer opções de escolhas de rede é definindo as opções diretamente no cloud template. Neste exemplo o valor será a tag que foi atribuida a cada rede no vRA.
formatVersion: 1 inputs: # selecionar a rede Network: type: string title: Network description: Selecione a rede oneOf: - title: VLAN 100 const: network:vmnet_100 - title: VLAN 111 const: network:vmnet_111 - title: VLAN 113 const: network:vmnet_113 - title: VLAN 114 const: network:vmnet_114 #--------------------------------------------------- resources: VM: type: Cloud.vSphere.Machine properties: image: Ubuntu 22.04 flavor: Small customizationSpec: vRA-Linux constraints: - tag: compute:vsan networks: - network: ${resource.Rede.id} assignment: static Rede: type: Cloud.vSphere.Network properties: networkType: existing constraints: - tag: ${input.Network} #---------------------------------------------------
Outra forma de fazer isso seria utilizando uma action do vRO (vRealize Orchestrator), porém, agora vamos deixar um pouquinho mais interessante. Neste exemplo as opções de rede serão exibidas baseado no tipo de ambiente selecionado. Se for selecionado produção, serão exibidas as opções VLAN 100 e 111, caso for selecionado desenvolvimento, serão as VLAN 113 e 114. Aqui vou demonstrar um script utilizando JavaScript, mas o vRO suporta Node.js, PowerCLI e Python também. Então vamos para a action do vRO.
var network = new Properties(); if (ambiente == "prod") { network.put("network:vmnet_100", "VLAN 100"); network.put("network:vmnet_111", "VLAN 111"); return network; } if (ambiente == "dev") { network.put("network:vmnet_113", "VLAN 113"); network.put("network:vmnet_114", "VLAN 114"); return network; } else { network.put("", "Selecione o ambiente"); return network; }
Após o script da action estar pronto, é necessário associarmos ao cloud template. Temos duas formas para fazer isso. A primeira seria definindo a action diretamente no cloud template utilizando o $dynamicEnum e o caminho da action no vRO + a variável.
formatVersion: 1 inputs: # selecionar o ambiente Ambiente: type: string title: Ambiente description: Selecione o ambiente oneOf: - title: Produção const: prod - title: Desenvolvimento const: dev # selecionar a rede Network: type: string title: Network description: Selecione a rede $dynamicEnum: /data/vro-actions/com.vmware.library.vra/conzaSelectNetwork?ambiente={{Ambiente}} #--------------------------------------------------- resources: VM: type: Cloud.vSphere.Machine properties: image: Ubuntu 22.04 flavor: Small customizationSpec: vRA-Linux constraints: - tag: compute:vsan networks: - network: ${resource.Rede.id} assignment: static Rede: type: Cloud.vSphere.Network properties: networkType: existing constraints: - tag: ${input.Network} #---------------------------------------------------
A outra forma é diretamente no custom forms. Neste caso, basta remover o $dynamicEnum do cloud template, no custom forms selecionar a action do vRO no campo de network e associar o campo de ambiente.
A difença entre as duas formas é que se você utilizar o $dynamicEnum poderá ver o resultado direto no cloud template, caso contrário precisará publicar um item de catalogo no content broker e associar a action do vRO utilizando o custom forms.
Independentemente qual seja a sua escolha, o resultado final será o mesmo.
Tudo parece lindo até você se perguntar como seria se existissem 30 redes ao invés de 4. Se você se perguntou isso, parabéns, você está no caminho certo. Utilizando o exemplo acima, se tivessemos 30 redes, seria necessário cadastrar todas manualmente na action do vRO e cada vez que uma nova rede surgisse ou uma rede existente fosse removida, a action precisaria ser editada.
Uma forma mais inteligente de fazer isso é gerenciar de forma dinamica, ou seja, vamos utilizar uma action do vRO para obter as redes automaticamente do vRA baseado nas tags. Neste exemplo cada rede possui duas tags: uma do ambiente (environment + prod ou dev) e outra com o nome da rede (network + vmnet_XXX).
Na action do vRO vamos buscar todas as redes e filtrar pelas redes baseado na escolha do ambiente. O script ficou assim:
var host = VraHostManager.defaultHostData; var allnetworks = VraEntitiesFinder.getFabricNetworks(host); var networks = []; var networktags = []; var tagprefix = "environment" // tag prefix (environment:dev / environment:prod) for (var inetwork = 0; inetwork < allnetworks.length; inetwork++) { if (allnetworks[inetwork].tags != null) { networktags = allnetworks[inetwork].tags; for (var itags = 0; itags < networktags.length; itags++) { if (networktags[itags].value == ambiente && networktags[itags].key == tagprefix){ networks.push(allnetworks[inetwork].name.toLowerCase()); } } } } return networks.sort();
Na imagem acima é possível observar que a tag de cada rede é formada por network: + o nome da rede, por isso é necessário modificar levemente o nosso cloud template, pois a action do vRO irá nos retornar apenas o nome da rede e precisamos adicionar o prefixo da tag.
Rede: type: Cloud.vSphere.Network properties: networkType: existing constraints: - tag: ${'network:' + (input.Network)}
É isso, pessoal. Lembrem-se que isso pode ser aplicado para clusters, storage profiles, cloud zones e qualquer outra coisa. Até a próxima!