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!









