vRA – Cloud Template 101 – Múltiplas VMs e discos
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. Uma pergunta recorrente é sobre múltiplos discos em múltiplas VMs e hoje vou demonstrar algumas formas de fazer isso.
Para começarmos de uma forma mais simples, veremos um exemplo de como configurar vários discos em uma única VM. Neste exemplo não temos nenhuma informação para o usuário inserir, estamos simulando um cloud template que irá prover uma VM com 2 discos, sendo um de 5GB e outro 10GB. Obs: estes discos são adicionais, pois o disco do sistema operacional é criado automaticamente baseado no template.
formatVersion: 1 inputs: {} resources: VM: type: Cloud.vSphere.Machine properties: image: Ubuntu 22.04 flavor: Small constraints: - tag: compute:vsan networks: - network: ${resource.Network.id} assignment: static storage: constraints: - tag: storage:tier1 attachedDisks: - source: ${resource.Disk_1.id} - source: ${resource.Disk_2.id} Disk_1: type: Cloud.vSphere.Disk properties: capacityGb: 5 Disk_2: type: Cloud.vSphere.Disk properties: capacityGb: 10 Network: type: Cloud.vSphere.Network properties: networkType: existing constraints: - tag: network:vmnet_100
Para deixamos este cloud template um pouco mais dinâmico, poderiamos permitir que o usuário escolha o tamanho do disco 1 adicionando um input, por exemplo.
inputs: TamanhoDisk_1: type: integer title: Tamanho do Disco (GB) description: Digite o tamanho em GB do Disco 1
Precisamos criar a referência deste input no Disk_1.
Disk_1: type: Cloud.vSphere.Disk properties: capacityGb: ${input.TamanhoDisk_1}
Agora vamos deixar um pouco mais interessante. Vamos criar um cloud template com 2 (ou mais) VMs e 2 discos adicionais de 10GB cada. O único input será a quantidade de instâncias (VMs).
formatVersion: 1 inputs: count: type: integer title: Instâncias description: Digite a quantidade de instâncias desejada default: 2 resources: VM: type: Cloud.vSphere.Machine allocatePerInstance: true properties: image: Ubuntu 22.04 flavor: Small count: ${input.count} constraints: - tag: compute:vsan networks: - network: ${resource.Network.id} assignment: static storage: constraints: - tag: storage:tier1 attachedDisks: ${map_to_object(slice(resource.Disk[*].id, 2*count.index, 2*(count.index + 1)), "source")} Disk: type: Cloud.vSphere.Disk allocatePerInstance: true properties: capacityGb: 10 count: ${2*input.count} Network: type: Cloud.vSphere.Network properties: networkType: existing constraints: - tag: network:vmnet_100
O cloud template começa a ficar mais legal, mas ainda não é o ideal, pois não sabemos exatamente qual a necessidade de tamanho e quantidade de discos do usuário. Neste caso, vamos permitir que o usuário escolha a quantidade e tamanho dos discos e de brinde ainda poderá escolher a controladora 🙂
formatVersion: 1 inputs: instance: type: integer title: Instâncias maximum: 5 minimum: 1 DiskTable: type: array title: Discos adicionais description: Até 5 discos extras por instância minItems: 0 maxItems: 5 items: type: object properties: size: type: integer title: Tamanho do disco minimum: 1 maximum: 100 SCSIController: type: string title: SCSI Controller enum: - SCSI_Controller_0 - SCSI_Controller_1 - SCSI_Controller_2 - SCSI_Controller_3 resources: Disk: type: Cloud.vSphere.Disk allocatePerInstance: true properties: capacityGb: '${(count.index < length(input.DiskTable) ? input.DiskTable[count.index].size : input.DiskTable[(count.index % length(input.DiskTable))].size)}' count: ${length(input.DiskTable) * input.instance} SCSIController: '${(count.index < length(input.DiskTable) ? input.DiskTable[count.index].SCSIController : input.DiskTable[(count.index % length(input.DiskTable))].SCSIController)}' VM: type: Cloud.vSphere.Machine allocatePerInstance: true properties: image: Ubuntu 22.04 flavor: Small count: ${input.instance} constraints: - tag: compute:vsan networks: - network: ${resource.Rede.id} assignment: static attachedDisks: ${map_to_object(slice(resource.Disk[*].id, length(input.DiskTable)*count.index, length(input.DiskTable)*(count.index+1)), "source")} Rede: type: Cloud.vSphere.Network properties: networkType: existing constraints: - tag: network:vmnet_100
É isso aí, pessoal. Várias opções para você utilizar como exemplo para as suas necessidades. Valeu e até a próxima!