В данной статье рассмотрено создание инфраструктуры виртуального дата-центра VMWare vCloud Director с использованием Terraform.
Изначально необходимо создать директорию, в которой будут располагаться файлы с кодом.
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.
Чтобы запустить проект необходимо загрузить все модули, для этого выполним следующую команду в директории проекта.
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.