As a cloud administrator, you can leverage the VMware Avi Load Balancer resources to build out your infrastructure. You can also use allocation helpers to provide allocation logic for your Avi Load Balancer resources.

Before you begin

Before you begin with any of the template examples, you must create your Avi Load Balancer cloud account in Automation Assembler, create a project, and add the cloud zone. For instructions, see Create a VMware Avi Load Balancer cloud account.

Simple LBaaS template

This sample template shows how you might create a virtual service, pool, and virtual IP resources with minimal inputs.

All Avi Load Balancer resources used in this example refer to Avi Load Balancer constructs that point to the Avi Load Balancer Controller.

No machines or servers are provisioned in this template. You get the list of servers, which can be updated continuously.

The template defaults to an empty pool, but the form and input is set up so that you can enter real IPs and a normal pool is created.

formatVersion: 1
name: ALB - LBaaS Demo - Simple
version: 1
inputs:
  port:
    type: integer
    title: Port
    description: Traffic sent to servers will use this destination server port unless overridden by the server's specific port attribute.
    default: 80
  servers:
    type: array
    title: Servers
    description: The pool directs load balanced traffic to this list of destination servers. The servers can be configured by IP address, name, network or via IP Address Group. Leaving 0.0.0.0 will result in an empty pool being created.
    items:
      type: string
    minItems: 0
    default:
      - 0.0.0.0
resources:
  VIP:
    type: Idem.AVILB.APPLICATIONS.VS_VIP
    properties:
      name: vip-${uuid()}
      account: avi-account
      description: Managed by Aria Automation
      vip:
        - vip_id: 0
          auto_allocate_ip: true
          ipam_network_subnet:
            network_ref: VMNetwork-PortGroup
  VirtualService:
    type: Idem.AVILB.APPLICATIONS.VIRTUAL_SERVICE
    properties:
      name: vs-${uuid()}
      account: avi-account
      description: Managed by Aria Automation
      services:
        - port: ${input.port}
      pool_ref: ${resource.Pool.name}
      vsvip_ref: ${resource.VIP.name}
  Pool:
    type: Idem.AVILB.APPLICATIONS.POOL
    properties:
      name: pool-${uuid()}
      account: avi-account
      description: Managed by Aria Automation
      default_server_port: ${input.port}
      servers: '${input.servers[0] == "0.0.0.0" ? null :map_by(input.servers, address => {"ip": {"addr": address, "type" : "V4"}})}'

Advanced LBaaS template

This sample template shows how you might create a virtual service, pool, and virtual IP resources connected to an existing network along with a cloud zone allocation helper. Additionally, the pool is configured with the system HTTP health monitor.

formatVersion: 1
name: ALB - LBaaS Demo
version: 1
inputs:
  env:
    type: string
    title: Environment
    description: Select Dev or Prod ALB environment
    default: env:dev
    oneOf:
      - title: Dev ALB
        const: env:dev
      - title: Prod ALB
        const: env:prod
  port:
    type: integer
    title: Port
    description: Input the server ip's to add to the pool.
    default: 80
  servers:
    type: array
    title: Servers
    description: Input the server ip's to add to the pool. Leaving 0.0.0.0 will result in an empty pool being created.
    items:
      type: string
    minItems: 0
    default:
      - 0.0.0.0
resources:
  Allocations_CloudZone_1:
    type: Allocations.CloudZone
    properties:
      accountType: avilb
      constraints:
        - tag: ${input.env}
  VIP:
    type: Idem.AVILB.APPLICATIONS.VS_VIP
    properties:
      name: vip-${uuid()}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      description: Managed by Aria Automation
      vip:
        - vip_id: 0
          auto_allocate_ip: true
          ipam_network_subnet:
            network_ref: ${resource.Cloud_vSphere_Network_1.resourceName}
  VirtualService:
    type: Idem.AVILB.APPLICATIONS.VIRTUAL_SERVICE
    properties:
      name: vs-${uuid()}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      description: Managed by Aria Automation
      services:
        - port: ${input.port}
      pool_ref: ${resource.Pool.name}
      vsvip_ref: ${resource.VIP.name}
  Pool:
    type: Idem.AVILB.APPLICATIONS.POOL
    properties:
      name: pool-${uuid()}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      description: Managed by Aria Automation
      default_server_port: ${input.port}
      servers: '${input.servers[0] == "0.0.0.0" ? null :map_by(input.servers, address => {"ip": {"addr": address, "type" : "V4"}})}'
      health_monitor_refs:
        - System-HTTP
  Cloud_vSphere_Network_1:
    type: Cloud.vSphere.Network
    properties:
      networkType: existing
      constraints:
        - tag: net:vm

Simple web servers template

This sample template shows how you might create a virtual service, pool, virtual IP, and two web server virtual machine resources connected to an existing network. The pool is configured to monitor port 80 using the Round Robin algorithm.

formatVersion: 1
name: ALB - Web Servers
version: 1
inputs:
  env:
    type: string
    title: Environment
    description: Select Dev or Prod ALB environment
    default: env:dev
    oneOf:
      - title: Dev ALB
        const: env:dev
      - title: Prod ALB
        const: env:prod
  clusterSize:
    type: string
    enum:
      - small
      - medium
      - large
    default: small
    title: Web Server Cluster Size
    description: Web Server Cluster Size. Small creates one web server and no ALB. Medium creates 2 web servers and a ALB. Large creates 4 web servers and a ALB.
  username:
    type: string
    title: Username
    default: demouser
  password:
    type: string
    title: Password
    encrypted: false
    default: VMware1!
  port:
    type: integer
    title: Port
    default: 80
  health_monitor:
    type: array
    items:
      type: string
    title: Health Monitors
    default:
      - System-HTTP
    minItems: 1
    maxItems: 10
  lb_algorithm:
    type: string
    title: Load Balancer Algorithm
    description: The load balancing algorithm will pick a server within the pool's list of available servers.
    readOnly: false
    default: LB_ALGORITHM_LEAST_CONNECTIONS
    oneOf:
      - title: Least Connections
        const: LB_ALGORITHM_LEAST_CONNECTIONS
      - title: Round Robin
        const: LB_ALGORITHM_ROUND_ROBIN
      - title: Fastest Response
        const: LB_ALGORITHM_FASTEST_RESPONSE
      - title: Consistent Hash
        const: LB_ALGORITHM_CONSISTENT_HASH
      - title: Least Load
        const: LB_ALGORITHM_LEAST_LOAD
      - title: Fewest Servers
        const: LB_ALGORITHM_FEWEST_SERVERS
      - title: Random
        const: LB_ALGORITHM_RANDOM
      - title: Fewest Tasks
        const: LB_ALGORITHM_FEWEST_TASKS
      - title: Core Affinity
        const: LB_ALGORITHM_CORE_AFFINITY
resources:
  ALB_HEALTH_MONITOR:
    type: Idem.AVILB.PROFILES.HEALTH_MONITOR
    properties:
      name: web-health-${uuid()}
      description: Managed by Aria Assembler
      type: ${input.health_monitor}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
  Allocations_CloudZone_1:
    type: Allocations.CloudZone
    properties:
      accountType: avilb
      constraints:
        - tag: ${input.env}
  ALB_APPLICATION_PERSISTENCE_PROFILE:
    type: Idem.AVILB.PROFILES.APPLICATION_PERSISTENCE_PROFILE
    properties:
      name: apache-appprofile-${uuid()}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      description: Managed by Aria Automation
      persistence_type: PERSISTENCE_TYPE_CLIENT_IP_ADDRESS
      server_hm_down_recovery: HM_DOWN_PICK_NEW_SERVER
      ip_persistence_profile:
        ip_mask: 24
        ip_persistent_timeout: 20
  SecurityGroup:
    type: Cloud.SecurityGroup
    properties:
      constraints:
        - tag: ${input.env}
      securityGroupType: existing
  VIP:
    type: Idem.AVILB.APPLICATIONS.VS_VIP
    properties:
      name: web-vip-${uuid()}
      description: Managed by Aria Automation
      count: ${input.clusterSize == "small" ? 0:1}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      vip:
        - vip_id: 0
          auto_allocate_ip: true
          ipam_network_subnet:
            network_ref: ${resource.Cloud_vSphere_Network_1.resourceName}
  VirtualService:
    type: Idem.AVILB.APPLICATIONS.VIRTUAL_SERVICE
    properties:
      name: web-vs-${uuid()}
      description: Managed by Aria Assembler
      count: ${input.clusterSize == "small" ? 0:1}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      cloud_type: CLOUD_VCENTER
      services:
        - port: ${input.port}
      vsvip_ref: ${resource.VIP[0].name}
      pool_ref: ${resource.Pool[0].name}
  Pool:
    type: Idem.AVILB.APPLICATIONS.POOL
    properties:
      name: web-pool-${uuid()}
      description: Managed by Aria Automation
      count: ${input.clusterSize == "small" ? 0:1}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      default_server_port: ${input.port}
      health_monitor_refs:
        - ${resource.ALB_HEALTH_MONITOR.name}
      lb_algorithm: ${input.lb_algorithm}
      application_persistence_profile_ref: ${resource.ALB_APPLICATION_PERSISTENCE_PROFILE.name}
      servers: '${map_by(resource.Web_Server[*].address, address => {"ip": {"addr": address, "type" : "V4"}})}'
  Web_Server:
    type: Cloud.vSphere.Machine
    properties:
      name: web
      count: 2
      flavor: small
      imageRef: https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64.ova
      cloudConfig: |
        packages:
          - apache2
          - open-vm-tools

        runcmd:
          ### update the top of the web page to the web servers resource name
          - sed -i 's/Apache2 Ubuntu Default Page/${self.resourceName}/g' /var/www/html/index.html
          
          ### Restart services
          - systemctl reload apache2
          - systemctl restart apache2
          
          ### Log completion
          - echo 'Cloud-init is done!' >> /tmp/finished.txt
      networks:
        - network: ${resource.Cloud_vSphere_Network_1.id}
          securityGroups:
            - ${resource.SecurityGroup.id}
  Cloud_vSphere_Network_1:
    type: Cloud.vSphere.Network
    properties:
      networkType: existing
      constraints:
        - tag: net:vm

Advanced web servers template

This template shows how you might create a virtual service, pool, and virtual IP resources connected to an existing network along with a cloud zone allocation helper. Additionally, a health monitor and an application persistence profile is created and configured in the pool. Finally, security groups are enumerated by tag and the VM web servers are added to it.

formatVersion: 1
name: ALB - Web Servers
version: 1
inputs:
  env:
    type: string
    title: Environment
    description: Select Dev or Prod ALB environment
    default: env:dev
    oneOf:
      - title: Dev ALB
        const: env:dev
      - title: Prod ALB
        const: env:prod
  clusterSize:
    type: string
    enum:
      - small
      - medium
      - large
    default: small
    title: Web Server Cluster Size
    description: Web Server Cluster Size. Small creates one web server and no ALB. Medium creates 2 web servers and a ALB. Large creates 4 web servers and a ALB.
  username:
    type: string
    title: Username
    default: demouser
  password:
    type: string
    title: Password
    encrypted: false
    default: VMware1!
  port:
    type: integer
    title: Port
    default: 80
  health_monitor:
    type: array
    items:
      type: string
    title: Health Monitors
    default:
      - System-HTTP
    minItems: 1
    maxItems: 10
  lb_algorithm:
    type: string
    title: Load Balancer Algorithm
    description: The load balancing algorithm will pick a server within the pool's list of available servers.
    readOnly: false
    default: LB_ALGORITHM_LEAST_CONNECTIONS
    oneOf:
      - title: Least Connections
        const: LB_ALGORITHM_LEAST_CONNECTIONS
      - title: Round Robin
        const: LB_ALGORITHM_ROUND_ROBIN
      - title: Fastest Response
        const: LB_ALGORITHM_FASTEST_RESPONSE
      - title: Consistent Hash
        const: LB_ALGORITHM_CONSISTENT_HASH
      - title: Least Load
        const: LB_ALGORITHM_LEAST_LOAD
      - title: Fewest Servers
        const: LB_ALGORITHM_FEWEST_SERVERS
      - title: Random
        const: LB_ALGORITHM_RANDOM
      - title: Fewest Tasks
        const: LB_ALGORITHM_FEWEST_TASKS
      - title: Core Affinity
        const: LB_ALGORITHM_CORE_AFFINITY
resources:
  ALB_HEALTH_MONITOR:
    type: Idem.AVILB.PROFILES.HEALTH_MONITOR
    properties:
      name: web-health-${uuid()}
      description: Managed by Aria Assembler
      type: ${input.health_monitor}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
  Allocations_CloudZone_1:
    type: Allocations.CloudZone
    properties:
      accountType: avilb
      constraints:
        - tag: ${input.env}
  ALB_APPLICATION_PERSISTENCE_PROFILE:
    type: Idem.AVILB.PROFILES.APPLICATION_PERSISTENCE_PROFILE
    properties:
      name: apache-appprofile-${uuid()}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      description: Managed by Aria Automation
      persistence_type: PERSISTENCE_TYPE_CLIENT_IP_ADDRESS
      server_hm_down_recovery: HM_DOWN_PICK_NEW_SERVER
      ip_persistence_profile:
        ip_mask: 24
        ip_persistent_timeout: 20
  SecurityGroup:
    type: Cloud.SecurityGroup
    properties:
      constraints:
        - tag: ${input.env}
      securityGroupType: existing
  VIP:
    type: Idem.AVILB.APPLICATIONS.VS_VIP
    properties:
      name: web-vip-${uuid()}
      description: Managed by Aria Automation
      count: ${input.clusterSize == "small" ? 0:1}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      vip:
        - vip_id: 0
          auto_allocate_ip: true
          ipam_network_subnet:
            network_ref: ${resource.Cloud_vSphere_Network_1.resourceName}
  VirtualService:
    type: Idem.AVILB.APPLICATIONS.VIRTUAL_SERVICE
    properties:
      name: web-vs-${uuid()}
      description: Managed by Aria Assembler
      count: ${input.clusterSize == "small" ? 0:1}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      cloud_type: CLOUD_VCENTER
      services:
        - port: ${input.port}
      vsvip_ref: ${resource.VIP[0].name}
      pool_ref: ${resource.Pool[0].name}
  Pool:
    type: Idem.AVILB.APPLICATIONS.POOL
    properties:
      name: web-pool-${uuid()}
      description: Managed by Aria Automation
      count: ${input.clusterSize == "small" ? 0:1}
      account: ${resource.Allocations_CloudZone_1.selectedCloudAccount.name}
      default_server_port: ${input.port}
      health_monitor_refs:
        - ${resource.ALB_HEALTH_MONITOR.name}
      lb_algorithm: ${input.lb_algorithm}
      application_persistence_profile_ref: ${resource.ALB_APPLICATION_PERSISTENCE_PROFILE.name}
      servers: '${map_by(resource.Web_Server[*].address, address => {"ip": {"addr": address, "type" : "V4"}})}'
  Web_Server:
    type: Cloud.vSphere.Machine
    properties:
      name: web
      count: 2
      flavor: small
      imageRef: https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64.ova
      cloudConfig: |
        packages:
          - apache2
          - open-vm-tools

        runcmd:
          ### update the top of the web page to the web servers resource name
          - sed -i 's/Apache2 Ubuntu Default Page/${self.resourceName}/g' /var/www/html/index.html
          
          ### Restart services
          - systemctl reload apache2
          - systemctl restart apache2
          
          ### Log completion
          - echo 'Cloud-init is done!' >> /tmp/finished.txt
      networks:
        - network: ${resource.Cloud_vSphere_Network_1.id}
          securityGroups:
            - ${resource.SecurityGroup.id}
  Cloud_vSphere_Network_1:
    type: Cloud.vSphere.Network
    properties:
      networkType: existing
      constraints:
        - tag: net:vm