Платформа vRealize Automation позволяет не только организовать работу облака, но и работать с ним, описывая инфраструктуру как код (Incfastructure as Code – IaC). Одним из самых распространённых инструментов, реализующих данную модель и уже интегрированным с vRA, является Terraform. Начинаем разбираться в совместной работе Terraform и vRA 8.
Если у нас быстрый старт, то сразу рабочий пример конфигурационного файла Terraform для создания сервера на vRA 8 (на основе опубликованного в каталоге шаблона):
# main.tf
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" {
  name        = var.deployment_name
  description = var.description
  catalog_item_id      = data.vra_catalog_item.this.id
  catalog_item_version = var.catalog_item_version
  project_id           = data.vra_project.this.id
  inputs = {
    vmSize    = var.flavor
    imageName = var.image
  }
  timeouts {
    create = "60m"
    delete = "20m"
  }
}
Для правильного заполнения всех полей в inputs запросите информацию о названиях полей и их значениях у администратора. Можете получить полное описание полей и самостоятельно — через REST API запрос к vRA: https://<vRA-HOSTNAME>/catalog/api/items/{catalog_item_id}.
Для работы требуется провайдер vra, он будет установлен при выполнении terraform init (вручную можно скачать по ссылке https://releases.hashicorp.com/terraform-provider-vra/)
# variables.tf
variable "url" {}
variable "refresh_token" {}
variable "insecure" {}
variable "project_name" {}
variable "catalog_item_name" {}
variable "catalog_item_version" {}
variable "deployment_name" {}
variable "flavor" {}
variable "image" {}
variable "description" {}
# terraform.tfvars
refresh_token        = "ys34567...LnfxhN"
url                  = "https://vra8.zabedu.ru"
insecure             = "true"
project_name         = "Project_AS"
catalog_item_name    = "Get new VM"
catalog_item_version = "2.4"
deployment_name      = "Terraform test"
flavor               = "medium"
image                = "CentOS_7"
description          = "Test deployment (terraform)"
Перед началом работы с vRA необходимо получить refresh-token, он действителен 90 дней. Токен возвращается POST запросом: https://<vRA-HOSTNAME>/csp/gateway/am/api/login?access_token. Параметры запроса и примеры получения токена найдёте в документации: https://code.vmware.com/docs/12597/GUID-AC1E4407-6139-412A-B4AA-1F102942EA94.html.
Готовый скрипт получения refresh-токена (для самых ленивых, python3):
# get_refresh_token.py
import requests
import json
from getpass import getpass
username = input("vRA user: ")
password = getpass()
body = {
    "username": username,
    "password": password
}
json_data = json.dumps(body)
vra_url = "https://vra8.zabedu.ru/csp/gateway/am/api/login?access_token"
headers = {'Content-type': 'application/json'}
response = requests.post(vra_url, verify = False, data = json_data, headers=headers)
response_json = response.json()
file_name = "refresh_token.txt"
f = open(file_name, "w")
f.write(response_json["refresh_token"])
f.close
Формы запросов на портале vRA часто содержат дополнительные проверки вводимых данных. Используя программные вызовы, Вы самостоятельно контролируете корректность всех передаваемых значений. Не забывайте что:
- Имена деплойментов vRA 8 не могут дублироваться;
 - Имена виртуальных машин должны быть уникальными и соответствовать Вашим внутренним стандартам и согласованному с администраторами формату;
 - Набор полей шаблона может быть изменён администраторами vRealize Automation (особенно на начальных этапах внедрения vRA);
 - Передача неправильных данных может привести к различным ошибкам как при развёртывании деплоймента, так и в процессе его работы.
 
Все конфигурационные файлы и код из данной статьи доступны для загрузки на https://github.com/isas2.