Solicitando um item de catálogo do Aria Automation utilizando o Terraform

Solicitando um item de catálogo do Aria Automation utilizando o Terraform

Antes de mais nada veja o artigo anterior sobre o provedor do vRA no Terraform. Vou assumir que você sabe sobre o que estou falando e vou direto ao assunto. Vamos começar com um blueprint simples:

formatVersion: 1
inputs:
  ambiente:
    type: string
    title: Ambiente
    description: Selecione o ambiente para deploy
    #default: prod
    oneOf:
      - title: Produção
        const: prod
      - title: Desenvolvimento
        const: dev
  servico:
    type: string
    title: Serviço
    description: Selecione o tipo do servidor
    oneOf:
      - title: Application
        const: app
      - title: Database
        const: db
      - title: Web Server
        const: web
  so:
    type: string
    title: Sistema Operacional
    description: Selecione o sistema operacional
    oneOf:
      - title: Ubuntu 22.04
        const: Ubuntu 22.04
      - title: Ubuntu 22.10
        const: Ubuntu 22.10
  instancias:
    type: integer
    title: Instâncias
    description: Digite a quantidade de instâncias desejada
    maximum: 10
    minimum: 1
  discoadicional:
    type: array
    title: Discos adicionais
    description: Até 5 discos extra por instância
    minItems: 0
    maxItems: 5
    items:
      type: object
      properties:
        size:
          type: integer
          title: Tamanho do disco (GB)
          minimum: 1
          maximum: 500
        SCSIController:
          type: string
          title: SCSI Controller
          enum:
            - SCSI_Controller_0
            - SCSI_Controller_1
            - SCSI_Controller_2
            - SCSI_Controller_3
resources:
  VM:
    type: Cloud.vSphere.Machine
    properties:
      name: '${"CAV-" + (input.ambiente == "prod" ? "P" : "D") + "-" + to_upper(input.servico) + "-"}'
      image: ${input.so}
      flavor: Small
      servico: ${input.servico}
      ambiente: ${input.ambiente}
      constraints:
        - tag: ${'environment:' + (input.ambiente)}
        - tag: ${'service:' + (input.servico)}
      networks:
        - network: ${resource.rede.id}
          assignment: static
      attachedDisks: ${map_to_object(slice(resource.disco[*].id, length(input.discoadicional)*count.index, length(input.discoadicional)*(count.index+1)), "source")}
  rede:
    type: Cloud.vSphere.Network
    properties:
      networkType: existing
      constraints:
        - tag: ${'environment:' + (input.ambiente)}
        - tag: ${'service:' + (input.servico)}
  disco:
    type: Cloud.vSphere.Disk
    allocatePerInstance: true
    properties:
      capacityGb: '${(count.index < length(input.discoadicional) ? input.discoadicional[count.index].size : input.discoadicional[(count.index % length(input.discoadicional))].size)}'
      SCSIController: '${(count.index < length(input.discoadicional) ? input.discoadicional[count.index].SCSIController : input.discoadicional[(count.index % length(input.discoadicional))].SCSIController)}'
      count: ${length(input.discoadicional) * input.instancias}

Agora basta versionar o blueprint e publica-lo no catálogo do vRA. Garanta que o usuário utilizado pelo Terraform tenha acesso a este item de catálogo. Vamos criar o arquivo main.tf.

terraform {
  required_providers {
    vra = {
      source = "vmware/vra"
    }
  }
}

provider "vra" {
  url           = var.url
  refresh_token = var.refresh_token
  insecure      = var.insecure
}

data "vra_project" "this" {
  name = var.project_name
}

data "vra_catalog_item" "this" {
  name            = var.catalog_item_name
  expand_versions = true
}

resource "vra_deployment" "this" {
  catalog_item_id      = data.vra_catalog_item.this.id
  catalog_item_version = var.catalog_item_version
  project_id           = data.vra_project.this.id
  
  name        = var.deployment_name
  description = var.deployment_desc
  
  inputs = {
    ambiente       = var.input_ambiente
    servico        = var.input_servico
    so             = var.input_so
    instancias     = var.input_instancias
    discoadicional = jsonencode(var.input_discoadicional)
  }
  
  timeouts {
    create = var.timeout_create
  update = var.timeout_update
    delete = var.timeout_delete
  }
}

E por fim, vamos criar o arquivo variables.tf contendo todas as variáveis que são necessárias para conseguirmos fazer deploy do item de catálogo no vRA.

##### ARIA AUTOMATION (VRA) ENVIRONMENT #####
variable "url" {
  type    = string
  default = "https://seu-vra-lindao"
}

variable "refresh_token" {
  type    = string
  default = "xyz"
}

variable "insecure" {
  type    = bool
  default = "true"
}

##### PROJECT AND CATALOG ITEM #####

variable "project_name" {
  type    = string
  default = "seu-projeto"
}

variable "catalog_item_name" {
  type    = string
  default = "seu item de catálogo"
}

variable "catalog_item_version" {
  type    = string
  default = "versão do item de catálogo. Ex: 1.1"
}

##### DEPLYOMENT #####

variable "deployment_name" {
  type    = string
  default = "ubuntu terraform"
}

variable "deployment_desc" {
  type    = string
  default = "terraform test"
}

##### INPUTS #####

variable "input_ambiente" {
  type    = string
  default = "prod"
}

variable "input_servico" {
  type    = string
  default = "app"
}

variable "input_so" {
  type    = string
  default = "Ubuntu 22.04"
}

variable "input_instancias" {
  type    = number
  default = 1
}

variable "input_discoadicional" {
  type = list(object({
    size           = number
    SCSIController = string
  }))
  default = [
    {
      size           = 10
      SCSIController = "SCSI_Controller_1"
    }
  ]
}

##### TIMEOUT #####

variable "timeout_create" {
  type    = string
  default = "30m"
}

variable "timeout_update" {
  type    = string
  default = "30m"
}

variable "timeout_delete" {
  type    = string
  default = "30m"
}

Agora execute .\terraform.exe init e depois .\terraform.exe apply para fazermos o deploy do item de catálogo de fato.

E é isso aí, o item de catálogo foi criado com sucesso!

Até a próxima. Valeu!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *