Demonstração de escalonamento horizontal no Aria Automation com NSX e Ansible

Demonstração de escalonamento horizontal no Aria Automation com NSX e Ansible

Recentemente conversei sobre escalonamento horizontal com um cliente e quando começamos a construir o blueprint percebi alguns detalhes interessantes, por isso resolvi escrever este artigo. A ideia é bastante simples: possuir um item de catálogo que possa criar um servidor web, mas além disso, é fundamental seguir alguns requisitos:

  • Possibilidade de criar multiplos servidores (instâncias);
  • Possibilidade de escalonamento horizontal sem afetar as instâncias existentes;
  • O servidor precisa nascer conectado a um balanceador de carga do NSX e possibilitar a escolha da porta, protocolo e algoritmo de balanceamento;
  • O servidor precisa ser associado a um grupo de segurança do NSX (as regras de firewall já existem);
  • O apache precisa ser instalado via Ansible sempre que uma nova instâncias for provisionada.

Nem vou considerar aqui o básico: hostname, endereço IP, registro DNS e integrações com NSX e Ansible (clique nos links para mais detalhes).

Antes de mostrar o blueprint em si, vou falar sobre dois detalhes importantes. O primeiro está relacionado com a dependência entre o componente do ansible e o componente do balanceador de carga. Definimos algumas variáveis de host no ansible que são do componente do balanceador de carga e por isso o ansible só pode iniciar o provisionamento após o balanceador de carga estar pronto. Para isso, utilizamos a resource flag dependsOn.

O outro ponto está relacionado com o escalonamento vertical, onde cada vez que uma nova instância era adicionada, o ansible tentava executar nas instâncias existentes gerando um erro genérico no inventário. Para resolver isso, utilizei a resource flag de ignoreChanges. Neste caso, o componente do ansible irá ignorar qualquer modificação nos componentes existentes.

Neste link estão outros resource flags para usar na construção do blueprint!

Detalhes explicados, então vamos ao blueprint:

formatVersion: 1
inputs:
  vm_environment:
    type: string
  vm_web_instances:
    type: integer
  vm_web_cpu:
    type: integer
  vm_web_memory:
    type: integer
  lb_web_port:
    type: integer
  lb_web_protocol:
    type: string
  lb_web_algorithm:
    type: string
resources:
  network_web:
    type: Cloud.NSX.Network
    properties:
      networkType: existing
      constraints:
        - tag: ${'environment:' + (input.vm_environment)}
        - tag: service:web
        - tag: network:nsx
  ansible_web:
    type: Cloud.Ansible
    dependsOn:
      - lb_web
    ignoreChanges: true
    properties:
      count: ${input.vm_web_instances}
      host: ${resource.vm_web.*}
      groups:
        - vra_web
      osType: linux
      account: Caverna Ansible
      username: root
      password: ${secret.caverna-linux}
      hostVariables:
        nsxVip: ${resource.lb_web.address}
        nsxAlgorithm: ${resource.lb_web.routes.algorithm[0]}
        nsxProtocol: ${resource.lb_web.routes.protocol[0]}
      playbooks:
        provision:
          - /etc/ansible/playbooks/install-apache.yml
  security_web:
    type: Cloud.SecurityGroup
    properties:
      securityGroupType: existing
      constraints:
        - tag: security:web
  vm_web:
    type: Cloud.vSphere.Machine
    allocatePerInstance: true
    properties:
      name: CAV-P-WEB-
      image: Ubuntu 22.04
      cpuCount: ${input.vm_web_cpu}
      totalMemoryMB: ${input.vm_web_memory}
      constraints:
        - tag: ${'environment:' + (input.vm_environment)}
        - tag: service:web
      networks:
        - network: ${resource.network_web.id}
          assignment: static
          securityGroups:
            - ${resource.security_web.id}
      count: ${input.vm_web_instances}
  lb_web:
    type: Cloud.NSX.LoadBalancer
    properties:
      name: CAV-P-WEB-LB-
      network: ${resource.network_web.id}
      instances: ${resource.vm_web[*].id}
      internetFacing: false
      routes:
        - instancePort: ${input.lb_web_port}
          instanceProtocol: ${input.lb_web_protocol}
          port: ${input.lb_web_port}
          protocol: ${input.lb_web_protocol}
          algorithm: ${input.lb_web_algorithm}
      constraints:
        - tag: nsx:lb-01

Para validar, vamos solicitar duas instâncias deste item de catálogo.

Se olharmos no NSX, podemos observar que o balanceador de carga já foi criado e as máquinas já foram adicionadas no server pool. Além disso, graças ao security group que configuramos, as máquinas também foram adicionadas ao grupo web.

O endereço IP do balanceador de carga está respondendo, apontando para o servidor CAV-P-WEB-243 e exibindo uma página de demonstração (isso foi configurado via ansible).

E por fim, o inventário do ansible respeitando as configurações que realizamos no blueprint. Inclusive revelando as minhas senhas super secretas. Parabéns 🙂

Agora já tenho dois servidores web e quero escalar horizontal, ou seja, vou adicionar mais um servidor no deployment existente. Neste caso, o plano exibido deve ser adicionar um novo componente de máquina virtual e um novo componente do ansible, além de atualizar o balanceador de carga incluindo a nova máquina.

Depois de alguns minutos a nova máquina foi criada, adicionada no balanceador de carga, grupo do NSX e também teve o apache instalado via ansible.

É isso aí. Valeu e 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 *