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!