Создание инфраструктуры в vCloud Director с использованием Terraform

В данной статье рассмотрено создание инфраструктуры виртуального дата-центра VMWare vCloud Director с использованием Terraform.


1. Создание инфраструктуры

Изначально необходимо создать директорию, в которой будут располагаться файлы с кодом.

mkdir terraformProject

В данной директории создадим следующие файлы.

$ tree .
.
├── main.tf
├── variables.tf
└── vcd.tfvars

main.tf - основной файл, в котором будет описана Iac. variables.tf - файл описания переменных проекта. vcd.tfvars - файл с явным указанием значений переменных, которые были определены в variables.tf.

Основной файл main.tf

Ниже приведена конфигурация основного файл IaC.

terraform {
  # Версия terraform
  required_version = ">=0.12.0"
}

# Настройка провайдера для подключения к vCloud Director
provider "vcd" {
  version              = "~> 2.6"
  user                 = var.vcd_org_user
  password             = var.vcd_org_password
  org                  = var.vcd_org_org
  vdc                  = var.vcd_org_vdc
  url                  = var.vcd_org_url
  allow_unverified_ssl = var.vcd_org_allow_unverified_ssl
  max_retry_timeout    = var.vcd_org_max_retry_timeout
}

# Создание маршрутизируемой сети
resource "vcd_network_routed" "internalRouted" {
  name         = "Routed 192.168.1.0/24"
# Указывается имя edge шлюза
  edge_gateway = var.vcd_org_edge_name
# Шлюз сети организации
  gateway = "192.168.1.1"
# 
  dhcp_pool {
    start_address = "192.168.1.2"
    end_address   = "192.168.1.100"
  }

  static_ip_pool {
    start_address = "192.168.1.101"
    end_address   = "192.168.1.254"
  }
}

# Создание vApp

resource "vcd_vapp" "vms" {
  name = "applica"
  power_on = "true"

  depends_on = [vcd_network_routed.internalRouted]
}

# Создание виртуальной машины vm1 в vApp

resource "vcd_vapp_vm" "vm1" {
  vapp_name     = vcd_vapp.vms.name
  name          = "applica_vm1"
  catalog_name  = var.vcd_org_catalog
  template_name = var.template_vm
  memory        = 2048
  cpus          = 2
  cpu_cores     = 1

  depends_on = [vcd_network_routed.internalRouted, vcd_vapp.regru]

  network {
    type               = "org"
    name               = vcd_network_routed.internalRouted.name
    ip                 = "192.168.1.101"
    ip_allocation_mode = "MANUAL"
  }

  guest_properties = {
    "guest.hostname" = "vm1.host.ru"
  }

  initscript = <<EOF
#!/bin/bash
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd
echo "ssh-rsa public_key user@host" >> ~/.ssh/authorized_keys
hostnamectl set-hostname vm2.host.ru
EOF

}

# Создание виртуальной машины vm2 в vApp

resource "vcd_vapp_vm" "vm2" {
  vapp_name     = vcd_vapp.vms.name
  name          = "applica_vm2"
  catalog_name  = var.vcd_org_catalog
  template_name = var.template_vm
  memory        = 2048
  cpus          = 2
  cpu_cores     = 1

  depends_on = [vcd_network_routed.internalRouted, vcd_vapp.regru]

  network {
    type               = "org"
    name               = vcd_network_routed.internalRouted.name
    ip                 = "192.168.1.102"
    ip_allocation_mode = "MANUAL"
  }

  guest_properties = {
    "guest.hostname" = "vm2.host.ru"
  }

  initscript = <<EOF
#!/bin/bash
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd
echo "ssh-rsa public_key user@host" >> ~/.ssh/authorized_keys
hostnamectl set-hostname vm2.host.ru
EOF

}

# Разрешаем Интернет в сеть 192.168.1.0/24

resource "vcd_firewall_rules" "Internet" {
  edge_gateway   = var.vcd_org_edge_name
  default_action = "allow"

  rule {
    description      = "Internet to 192.168.1.0/24"
    policy           = "allow"
    protocol         = "any"
    destination_port = "any"
    destination_ip   = "192.168.1.0/24"
    source_port      = "any"
    source_ip        = "any"
  }

  depends_on = [vcd_network_routed.internalRouted]
}

# SNAT

resource "vcd_snat" "outbound" {
  description  = "SNAT rule"
  edge_gateway = var.vcd_org_edge_name
  network_type = "org"
  external_ip  = "194.67.117.132"
  internal_ip  = "192.168.1.0/24"

  depends_on = [vcd_network_routed.internalRouted]
}

# DNAT for vm1

resource "vcd_dnat" "to_vm1" {
  edge_gateway    = var.vcd_org_edge_name
  external_ip     = "194.67.117.132"
  port            = 22101
  internal_ip     = "192.168.1.101"
  translated_port = 22

  depends_on = [vcd_network_routed.internalRouted]
}

# DNAT for reg2 machine

resource "vcd_dnat" "to_vm2" {
  edge_gateway    = var.vcd_org_edge_name
  external_ip     = "194.67.117.132"
  port            = 22102
  internal_ip     = "192.168.1.102"
  translated_port = 22

  depends_on = [vcd_network_routed.internalRouted]
}
  • Значение max_retry_timeout определяет время ожидания для взаимодействия ресурсов. По-умолчанию данное значение равно 60 секунд.
  • Значение allow_unverified_ssl - если true отключает проверку SSL-сертификата. По-умолчанию установлено значение false.
  • Для значений external_ip может быть выбран любой IP или множество IP адресов из списка IP Allocations (Edges > выбрать шлюз Edge > Configuration > IP Allocation > выбрать из предлагаемого списка).
  • Значение для initscript может быть bash-скрипт или shell-скрипт для Windows. Также возможно импортировать файл со скриптом.
  • Директива depends_on означает зависимость от других ресурсов и ресурс, в которой данная директива указана не будет запущен до тех пор пока не будут созданы другие ресуры, которые указанны в списке.

Файл переменных variables.tf

Ниже представлен файл с описанием переменных, которые используют в коде основного файла. Также указаны значения по-умолчанию для всех переменных.

variable "vcd_org_user" {
  default     = "administrator"
  description = "vCD Tenant User"
}

variable "vcd_org_password" {
  default     = "password"
  description = "vCD Tenant Password"
}

variable "vcd_org_org" {
  default     = "def_org"
  description = "vCD Tenant Org"
}

variable "vcd_org_url" {
  default     = "https://vcd.vmcloud.reg.ru/api"
  description = "vCD Tenant URL"
}

variable "vcd_org_vdc" {
  default     = "def_org_vdc"
  description = "vCD Tenant VDC"
}

variable "vcd_org_max_retry_timeout" {
  description = "Retry Timeout"
  default     = "240"
}

variable "vcd_org_allow_unverified_ssl" {
  description = "vCD allow unverified SSL"
  default     = "true"
}

variable "vcd_org_edge_name" {
  description = "vCD edge name"
  default     = "def_edge"
}

variable "vcd_org_catalog" {
  description = "vCD Catalog Name"
}

variable "template_vm" {
  description = "template vm"
  default = "CentOS-7.6-x86_64-Minimal-1810_en"
}

Файл значений переменных vcd.tfvars

Ниже представлен пример файл переменных. Вместо значений переменных необходимо подставить свои значения.

vcd_org_url                  = "https://some.domain.ru/api"
vcd_org_user                 = "administrator"
vcd_org_password             = "some_password"
vcd_org_org                  = "some_org"
vcd_org_vdc                  = "some_org_vdc"
vcd_org_allow_unverified_ssl = true
vcd_org_max_retry_timeout    = 1800
vcd_org_edge_name            = "some_edge_name"
vcd_org_catalog              = "Public templates"
template_vm                  = "CentOS-7.6-x86_64-Minimal-1810_en"

В данном примере используем шаблон CentOS 7.

2. Запуск инфраструктуры

Чтобы запустить проект необходимо загрузить все модули, для этого выполним следующую команду в директории проекта.

terraform init

После выполнения команды будут созданы дополнительные файлы с описанием состояния инфраструктуры. Далее необходимо выполнить следующую команду для запуска инфраструктуры.

terraform apply -var-file=vcd.tfvars

Далее необходимо подтвердить создание и дождаться завершения. После чего провим подключения к виртуальным машинам. Для подключения к vm1.

ssh root@194.67.117.132 -p 20101

Для подключения к vm2.

ssh root@194.67.117.132 -p 20102

В некоторых шаблонах VMware сервис sshd доступен только после того, как подключиться к виртуальной машине через веб-консоль, ввести пароль и только после этого автоматически будет запущен сервис и добавлен в автозагрузку. Если такое происходит, то рекомендуется создать новый шаблон виртуальной машины для дальнейшего использования, в котором изначально будет запущен сервис sshd.

Источники:

  1. Документация Terraform по vCloud Director
  2. VMware vCloud Director Provider for Terraform
Сведения о статье:
Дата публикации: 14/02/2020 1:43AM
Последнее обновление: 14/02/2020 3:31AM (rmntrvn)
Поделиться статьей: 
Автор: rmntrvn
Постоянная ссылка: http://kb.rmntrvn.ru/kb/iac-vcloud-director-with-terraform
terraform | vmware | vcloud director |