vRA – Cloud Template 101 – Opções de escolha de rede

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!

Deixe um comentário

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