Как да управлявате облачна инфраструктура с Terraform

Как да управлявате облачна инфраструктура с Terraform

В тази статия ще разгледаме от какво се състои Terraform и стъпка по стъпка ще стартираме собствената си инфраструктура в облака с VMware — подготвим три VM за различни цели: прокси, файлово хранилище и CMS.

Всичко подробно и в три етапа:

1. Terraform — описание, предимства и компоненти

Terraform е IaC (Infrastructure-as-Code) инструмент за изграждане и управление на виртуална инфраструктура с помощта на код.

В работата с инструмента отбелязахме няколко предимства:

  • Скорост на разгръщане на нови тенанти (потребителски виртуални среди). Обикновено, колкото повече нови клиенти, толкова повече "кликове" е необходимо да направят служителите на техническата поддръжка за публикуване на нови ресурси. С Terraform потребителите могат да променят параметрите на виртуалните машини (например, автоматично да изключват ОС и да увеличават раздела на виртуалния диск) без участието на техническа поддръжка и изключване на самата машина.

  • Моментална проверка на плана за активиране на нов тенант. С помощта на описанието на кода на инфраструктурата можем незабавно да проверим какво и в какъв ред ще бъде добавено, както и в какво крайно състояние ще бъде дадена виртуална машина или виртуална мрежа с връзки към виртуални машини.

  • Възможност за описание на повечето популярни облачни платформи. Можете да използвате инструмента от Amazon и Google Cloud, до частни платформи на базата на VMware vCloud Director, предлагащи услуги в рамките на IaaS, SaaS и PaaS решения.

  • Управление на няколко облачни доставчици и разпространение на инфраструктурата между тях за повишаване на устойчивостта, използвайки една конфигурация за създаване, диагностика и управление на облачни ресурси.

  • Удобно използване за създаване на демо стендове за тестване и отстраняване на проблеми с софтуера. Можете да създавате и предавате стендове за отдела по тестове, едновременно да проверявате софтуера в различни среди, както и незабавно да променяте и премахвате ресурси, създавайки само един план за изграждане на ресурси.

«Терариум» на Terraform

Кратко споменахме предимствата на инструмента, сега да разгледаме неговите компоненти

Providers (доставчици). 

В Terraform практически все типове инфраструктура могат да бъдат представяни като ресурси. Връзката между ресурсите и платформения API се осигурява от модули providers, които позволяват създаването на ресурси в рамките на определена платформа, например Azure или VMware vCloud Director.

В рамките на проекта можете да взаимодействате с различни предоставячи на различни платформи.

Ресурси (описание на ресурсите).

Описание на ресурсите позволява управление на компонентите на платформата, например виртуални машини или мрежи. 

Можете сами да създадете описание на ресурсите за предоставяча VMware vCloud Director и да използвате това описание за създаване на ресурси при всеки хостинг предоставяч, който използва vCloud Director. Ще ви е необходимо само да замените параметрите за удостоверяване и параметрите за мрежова свързаност с необходимия хостинг предоставяч.

Provisioners.

Тази съставна част позволява извършване на операции по първоначалното инсталиране и обслужване на операционната система след създаването на виртуални машини. След като създадете ресурс на виртуална машина, с помощта на provisioners можете да конфигурирате и свържете по SSH, да извършите актуализация на операционната система и също така да качите и изпълните скрипт. 

Входни и Изходни променливи.

Входните променливи са входящи променливи за всякакви видове блокове. 

Изходните променливи позволяват запазване на стойности след създаване на ресурси и могат да бъдат използвани като входни променливи в други модули, например в блока Provisioners.

Състояния.

Файловете с състояния съхраняват информация за конфигурацията на ресурсите на платформата на предоставяча. При първоначалното създаване на платформата няма информация за ресурсите и преди всяка операция Terraform обновява състоянието с реалната инфраструктура на вече описаните ресурси.

Основната цел на състоянията е да запазят връзката между обектите на вече създадените ресурси за сравнение на конфигурацията на добавените ресурси и обектите, с цел избягване на повторно създаване и промени в платформата.

Информацията за състоянието по подразбиране се съхранява в локален файл terraform.tfstate, но при необходимост има възможност за използване на отдалечено хранилище за работа в екип.

Също така можете да импортирате текущите ресурси на платформата в състояние, за да взаимодействате с други ресурси, които от своя страна са създадени без помощта на Terraform.  

2. Създаване на инфраструктура

След като разгледахме компонентите, сега с помощта на Terraform поетапно ще създадем инфраструктура с три виртуални машини. Първата ще бъде с инсталиран прокси сървър nginx, втората с хранилище на файлове базирано на Nextcloud и третата с CMS Bitrix.

Кода ще пишем и изпълняваме на примера на нашето облако на VMware vCloud Director. У нас потребителите получават учетна запис с права на Organization Administrator. Ако използвате учетна запис със същите права в друго облако VMware, ще можете да възпроизведете кода от нашите примери. Да започнем!

Първо ще създадем директория за нашия нов проект, в която ще се разположат файловете с описанието на инфраструктурата.

mkdir project01

След това ще опишем компонентите на инфраструктурата. Terraform създава връзките и обработва файловете въз основа на описанието в тях. Файловете могат да бъдат именувани в зависимост от целта на описваните блокове, например, network.tf — описва мрежовите параметри на инфраструктурата.

За описание на компонентите на нашата инфраструктура, създадохме следните файлове:

Списък на файловете.

main.tf — описание на параметрите за виртуалната среда — виртуални машини, виртуални контейнери;

network.tf — описание на параметрите на виртуалната мрежа и правила за NAT, Firewall;

variables.tf — списък на променливите, които използваме;

vcd.tfvars — стойности на променливите за проекта за модула VMware vCloud Director.

Язикът на конфигурацията в Terraform е декларативен и редът на блоковете няма значение, освен за блоковете provisioner, тъй като в този блок описваме командите за изпълнение при подготовка на инфраструктурата и те ще се изпълняват последователно.

Структура на блоковете.

"" "" {

# Block body

= # Аргумент

}

За описание на блоковете се използва собствен язик за програмиране HCL (HashiCorp Configuration Language), инфраструктурата може да бъде описана и с помощта на JSON. Повече информация за синтаксиса можете да прочетете на сайта на разработчика.

Конфигурация на променливите в средата, variables.tf и vcd.tfvars

Първо ще създадем два файла, които описват списъка на всички използвани променливи и техните стойности за модула VMware vCloud Director. Първо ще създадем файла variables.tf.

Съдържание на файла variables.tf.

променлива "vcd_org_user" {

  описание = "vCD потребител на наемател"

}

променлива "vcd_org_password" {

  описание = "vCD парола на наемателя"

}

променлива "vcd_org" {

  описание = "vCD наемателска организация"

}

променлива "vcd_org_vdc" {

  описание = "vCD наемателски VDC"

}

променлива "vcd_org_url" {

  описание = "vCD URL на наемателя"

}

променлива "vcd_org_max_retry_timeout" {

  по подразбиране = "60"

}

променлива "vcd_org_allow_unverified_ssl" {

  по подразбиране = "true"

}

променлива "vcd_org_edge_name" {

  описание = "името на ръба на vCD"

}

променлива "vcd_org_catalog" {

  описание = "публичен каталог на vCD"

}

променлива "vcd_template_os_centos7" {

  описание = "ОС CentOS 7"

  по подразбиране = "CentOS7"

}

променлива "vcd_org_ssd_sp" {

  описание = "Политики за съхранение"

  по подразбиране = "Златна политика за съхранение"

}

променлива "vcd_org_hdd_sp" {

  описание = "Политики за съхранение"

  по подразбиране = "Бронзова политика за съхранение"

}

променлива "vcd_edge_local_subnet" {

  описание = "Подмрежа на организационната мрежа"

}

променлива "vcd_edge_external_ip" {

  описание = "Външен публичен IP"

}

променлива "vcd_edge_local_ip_nginx" {}

променлива "vcd_edge_local_ip_bitrix" {}

променлива "vcd_edge_local_ip_nextcloud" {}

променлива "vcd_edge_external_network" {}

Стойности на променливи, които получаваме от доставчика.

  • vcd_org_user — име на потребителя с права на администратор на организацията,

  • vcd_org_password — парола на потребителя,

  • vcd_org — име на организацията,

  • vcd_org_vdc — име на виртуалния дата-център,

  • vcd_org_url — API URL,

  • vcd_org_edge_name — име на виртуалния маршрутизатор,

  • vcd_org_catalog — име на каталога с шаблони за виртуални машини,

  • vcd_edge_external_ip — публичен IP адрес,

  • vcd_edge_external_network — име на външната мрежа,

  • vcd_org_hdd_sp — име на политиката за съхранение на HDD,

  • vcd_org_ssd_sp — име на политиката за съхранение на SSD.

И въвеждаме собствените си променливи:

  • vcd_edge_local_ip_nginx — IP адрес на виртуалната машина с NGINX,

  • vcd_edge_local_ip_bitrix — IP адрес на виртуалната машина с 1С: Битрикс,

  • vcd_edge_local_ip_nextcloud — IP адрес на виртуалната машина с Nextcloud.

С втория файл създаваме и указваме променливите за модула VMware vCloud Director в файла vcd.tfvars: Напомняме, че в нашия пример използваме собствено облако mClouds, ако работите с друг доставчик, уточнете стойностите от него. 

Съдържание на файла vcd.tfvars.

vcd_org_url = "https://vcloud.mclouds.ru/api"

vcd_org_user = "orgadmin"

vcd_org_password = "*"

vcd = "org"

vcd_org_vdc = "orgvdc"

vcd_org_maxretry_timeout = 60

vcd_org_allow_unverified_ssl = true

vcd_org_catalog = "Templates"

vcd_templateos_centos7 = "CentOS7"

vcd_org_ssd_sp = "Gold Storage Policy"

vcd_org_hdd_sp = "Bronze Storage Policy"

vcd_org_edge_name = "MCLOUDS-EDGE"

vcd_edge_external_ip = "185.17.66.1"

vcd_edge_local_subnet = "192.168.110.0/24"

vcd_edge_local_ip_nginx = "192.168.110.1"

vcd_edge_local_ip_bitrix = "192.168.110.10"

vcd_edge_local_ip_nextcloud = "192.168.110.11"

vcd_edge_external_network = "NET-185-17-66-0"

Мрежова конфигурация, network.tf.

Ограничения на достъп до управление на мрежата са задължителни, затова ще зададем преглед на IP адреса и настройките на портовете за достъп до виртуалните машини. Започваме с настройките на NAT за предоставяне на достъп до виртуалните ресурси.

Как да управлявате облачна инфраструктура с TerraformМрежовата схема за създаваната платформа Terraform

Създаваме виртуална организационна мрежа с името net_lan01, с подразбиращ се шлюз: 192.168.110.254, както и адресно пространство: 192.168.110.0/24.

Описваме виртуалната мрежа.

resource "vcd_network_routed" "net" {

  name = "net_lan01"

  edge_gateway = var.vcd_org_edge_name

  gateway = "192.168.110.254"

  dns1 = "1.1.1.1"

  dns2 = "8.8.8.8"

 static_ip_pool {

start_address = "192.168.110.1"

end_address = "192.168.110.253"

  }

}

Създаваме правила за фаерите, за да предоставим на виртуалните машини достъп до интернет. В рамките на този блок всички виртуални ресурси в облака ще имат достъп до интернет:

Описваме правилата за достъп на виртуалните машини до интернет.

resource "vcd_nsxv_firewall_rule" "fw_internet_access" {

  edge_gateway = var.vcdorgedgename

  name = "Internet Access"

  source {

gateway_interfaces = ["internal"]

  }

  destination {

gateway_interfaces = ["external"]

  }

  service {

protocol = "any"

  }

  depends_on = [vcdnetworkrouted.net]

}

Следвайки зависимостта, започваме конфигурацията на блока vcdnsxvfirewallrule след обработката на блока vcdnetworkrouted.net., с помощта на dependson. Използваме тази опция, тъй като някои зависимости могат да бъдат разпознати неявно в конфигурацията.

След това ще създадем правила, позволяващи достъп до портовете от външната мрежа и ще зададем нашия IP адрес за SSH връзка с сървърите. Всеки потребител от интернет има достъп до портове 80 и 443 на уеб сървъра, а потребителят с IP адрес 90.1.15.1 има достъп до SSH портовете на виртуалните сървъри.

Разрешаваме достъпа до портове от външната мрежа.

resource "vcd_nsxv_firewall_rule" "fwnatports" {

  edge_gateway = var.vcd_org_edge_name

  name = "HTTPs Access"

  source {

gateway_interfaces = ["external"]

  }

  destination {

  gateway_interfaces = ["internal"]

  }

  service {

protocol = "tcp"

port = "80"

  }

  service {

protocol = "tcp"

port = "443"

  }

  depends_on = [vcd_network_routed.net]

}

resource "vcd_nsxv_firewall_rule" "fw_nat_admin_ports" {

  edge_gateway = var.vcd_org_edge_name

  name = "Admin Access"

  source {

  ip_addresses = [ "90.1.15.1" ]

  }

  destination {

  gateway_interfaces = ["internal"]

  }

  service {

protocol = "tcp"

port = "58301"

  }

  service {

protocol = "tcp"

port = "58302"

  }

  service {

protocol = "tcp"

port = "58303"

  }

  depends_on = [vcd_network_routed.net]

}

Създаваме правила Source NAT за достъп до интернет от облачната локална мрежа:

Описваме правилата Source NAT.

resource "vcd_nsxv_snat" "snat_local" {

edge_gateway = var.vcd_org_edge_name

  network_type = "ext"

  network_name = var.vcdedgeexternalnetwork

  original_address = var.vcd_edge_local_subnet

translated_address = var.vcd_edge_external_ip

  depends_on = [vcd_network_routed.net]

}

И накрая, в конфигурацията на мрежовия блок добавяме правила Destination NAT за достъп до услугите от външната мрежа:

Добавяме правила Destination NAT.

resource "vcd_nsxv_dnat" "dnat_tcp_nginx_https" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

  description = "NGINX HTTPs"

оригинален_адрес = var.vcd_edge_external_ip
оригинален_порт = 443

преведен_адрес = var.vcd_edge_local_ip_nginx
преведен_порт = 443
протокол = "tcp"

depends_on = [vcd_network_routed.net]
}
ресурс "vcd_nsxv_dnat" "dnat_tcp_nginx_http" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

описание = "NGINX HTTP"

оригинален_адрес = var.vcd_edge_external_ip
оригинален_порт = 80

преведен_адрес = var.vcd_edge_local_ip_nginx
преведен_порт = 80
протокол = "tcp"

depends_on = [vcd_network_routed.net]

}

Добавяме правило за NAT за транслация на портове към SSH сървъра под Nginx.

ресурс "vcd_nsxv_dnat" "dnat_tcp-nginx_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

описание = "SSH NGINX"

оригинален_адрес = var.vcd_edge_external_ip
оригинален_порт = 58301

преведен_адрес = var.vcd_edge_local_ip_nginx
преведен_порт = 22
протокол = "tcp"

depends_on = [vcd_network_routed.net]

}

Добавяме правило за NAT за транслация на портове към SSH сървъра с 1С-Битрикс.

ресурс "vcd_nsxv_dnat" "dnat_tcp_bitrix_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

описание = "SSH Bitrix"

оригинален_адрес = var.vcd_edge_external_ip
оригинален_порт = 58302

преведен_адрес = var.vcd_edge_local_ip_bitrix
преведен_порт = 22
протокол = "tcp"

depends_on = [vcd_network_routed.net]

}

Добавяме правило за NAT за транслация на портове към SSH сървъра с Nextcloud.

ресурс "vcd_nsxv_dnat" "dnat_tcp_nextcloud_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

описание = "SSH Nextcloud"

оригинален_адрес = var.vcd_edge_external_ip
оригинален_порт = 58303 преведен_адрес = var.vcd_edge_local_ip_nextcloud
преведен_порт = 22
протокол = "tcp"

depends_on = [vcd_network_routed.net]

}

Конфигурация на виртуалната среда main.tf

Както планирахме в началото на статията, ще създадем три виртуални машини. Те ще бъдат подготовени с "Guest Customization". Мрежовите параметри ще бъдат зададени съгласно нашите настройки, а паролата за потребителя се генерира автоматично.

Описание на vApp, в който ще се намират виртуалните машини и тяхната конфигурация.

Как да управлявате облачна инфраструктура с TerraformКонфигурация на виртуалните машини

Създаваме контейнер vApp. За да можем незабавно да свържем vApp и ВМ към виртуалната мрежа, също добавяме параметър depends_on:

Създаваме контейнер

ресурс "vcd_vapp" "vapp" {
име = "web"
включено = "истина" depends_on = [vcd_network_routed.net]

}

Създаваме виртуална машина с описание

ресурс "vcd_vapp_vm" "nginx" {

vapp_name = vcd_vapp.vapp.name

име = "nginx"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

памет = 8192

процесори = 1

ядра_cpu = 1

мрежа {

тип = "org"

име = vcd_network_routed.net.name

е_основен = истина

тип_адаптер = "VMXNET3"

режим_разпределение_ip = "MANUAL"

ip = var.vcd_edge_local_ip_nginx

}

презапис_шаблон_диск {

тип_шина = "paravirtual"

размер_в_mb = "32768"

номер_на_шина = 0

номер_на_единица = 0

storage_profile = var.vcd_org_ssd_sp

}

}

Основни параметри в описанието на ВМ:

  • име — име на виртуалната машина,

  • vappname — име на vApp, в който да добавим нова ВМ,

  • catalogname / templatename — название на каталога и название на шаблона на виртуалната машина,

  • storageprofile — политика за съхранение по подразбиране.

Параметри на блока мрежа:

  • тип — тип на свързаната мрежа,

  • име — към която виртуална мрежа да се свърже ВМ,

  • е_основен — основен мрежов адаптер,

  • режим_разпределение_ip — режим на разпределение на адреса MANUAL / DHCP / POOL,

  • ip — IP адрес за виртуалната машина, ще го зададем ръчно.

Блок презапис_шаблон_диск:

  • размервmb — размер на стартовия диск за виртуалната машина

  • storage_profile — политика за съхранение за диска

Създаваме втора ВМ с описание на файловото хранилище Nextcloud

ресурс "vcd_vapp_vm" "nextcloud" {

vapp_name = vcd_vapp.vapp.name

име = "nextcloud"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

памет = 8192

процесори = 1

ядра_cpu = 1

мрежа {

тип = "org"

име = vcd_network_routed.net.name

е_основен = истина

тип_адаптер = "VMXNET3"

режим_разпределение_ip = "MANUAL"

ip = var.vcd_edge_local_ip_nextcloud

}

презапис_шаблон_диск {

тип_шина = "paravirtual"

размер_в_mb = "32768"

номер_на_шина = 0

номер_на_единица = 0

storage_profile = var.vcd_org_ssd_sp

}

}

ресурс "vcd_vm_internal_disk" "disk1" {

vapp_name = vcd_vapp.vapp.name

vm_name = "nextcloud"

bus_type = "paravirtual"

size_in_mb = "102400"

bus_number = 0

unit_number = 1

storage_profile = var.vcd_org_hdd_sp

allow_vm_reboot = true

depends_on = [ vcd_vapp_vm.nextcloud ]

}

В секцията vcdvminternal_disk описваме нов виртуален диск, който се свързва към виртуалната машина.

Обяснения за блока vcdvminternaldisk:

  • bustype — тип на контролера на диска

  • sizeinmb — размер на диска

  • busnumber / unitnumber — местоположение на свързването в адаптера

  • storage_profile — политика за съхранение за диска

Опишете последната VM на Битрикс

ресурс "vcd_vapp_vm" "bitrix" {

vapp_name = vcd_vapp.vapp.name

име = "bitrix"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

памет = 8192

процесори = 1

ядра_cpu = 1

мрежа {

тип = "org"

име = vcd_network_routed.net.name

е_основен = истина

тип_адаптер = "VMXNET3"

режим_разпределение_ip = "MANUAL"

ip = var.vcd_edge_local_ip_bitrix

}

презапис_шаблон_диск {

тип_шина = "paravirtual"

size_in_mb = "81920"

номер_на_шина = 0

номер_на_единица = 0

storage_profile = var.vcd_org_ssd_sp

}

}

Актуализация на ОС и инсталиране на допълнителни скриптове

Мрежата е подготвена, виртуалните машини са описани. Преди импортиране на нашата инфраструктура можем предварително да извършим основно провижиниране с помощта на блоковете на provisioners и без използване на Ansible.

Нека видим как да актуализираме ОС и да стартираме инсталационния скрипт на CMS Bitrix с помощта на блока на provisioner.

Най-напред ще извършим инсталацията на пакети за актуализация на CentOS.

ресурс "null_resource" "nginx_update_install" {

provisioner "remote-exec" {

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.nginx.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58301"

timeout = "30s"

}

inline = [

"yum -y update && yum -y upgrade",

"yum -y install wget nano epel-release net-tools unzip zip" ]

}

}

}

Обозначение на съставките:

  • provisioner «remote-exec» — свързваме блока за отдалечено провижиниране

  • В блока connection описваме типа и параметрите за свързване:

  • type — протокол, в нашия случай SSH;

  • user — име на потребителя;

  • password — парола на потребителя. В нашия случай се позоваваме на параметъра vcdvappvm.nginx.customization[0].admin_password, който съдържа генерираната парола на потребителя на системата.

  • host — външният IP адрес за свързване;

  • port — порт за свързване, който преди това е зададен в настройките на DNAT;

  • inline — изброяваме списък с командите, които ще бъдат въведени. Командите ще бъдат въведени последователно, както е посочено в тази секция.

Като пример, допълнително ще извършим скрипта за инсталация на 1С-Битрикс. Изходът от изпълнението на скрипта ще бъде достъпен по време на изпълнение на плана. За инсталацията на скрипта, първо ще опишем блока:

Опишете инсталацията на 1С-Битрикс.

provisioner "file" {

source = "prepare.sh"

destination = "\/tmp\/prepare.sh"

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.nginx.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58301"

timeout = "30s"

}

}

provisioner "remote-exec" {

inline = [

"chmod +x \/tmp\/prepare.sh", "\/tmp\/prepare.sh"

]

}

И веднага опишете актуализацията на Битрикс.

Пример за провижиниране на 1С-Битрикс.

ресурс "null_resource" "install_update_bitrix" {

provisioner "remote-exec" {

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.bitrix.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58302"

timeout = "60s"

}

inline = [

"yum -y update && yum -y upgrade",

"yum -y install wget nano epel-release net-tools unzip zip",

"wget http:\/\/repos.1c-bitrix.ru\/yum\/bitrix-env.sh -O \/tmp\/bitrix-env.sh",

"chmod +x \/tmp\/bitrix-env.sh",

"\/tmp\/bitrix-env.sh"

]

}

}

Важно! Скрипт може да не сработи, ако предварително не деактивирате SELinux! Ако ви трябва подробна статия за инсталиране и настройка на CMS 1С-Битрикс с помощта на bitrix-env.sh, можете да се възползвате от нашата статия в блога на сайта.

3. Инициализация на инфраструктурата

Как да управлявате облачна инфраструктура с TerraformИнициализация на модули и приставки

За работа използваме прост "джентълменски комплект": лаптоп с ОС Windows 10 и дистрибуция от официалния сайт terraform.io. Разопаковаме и инициализираме с команда: terraform.exe init

След описанието на изчислителната и мрежовата инфраструктура, стартираме планиране за проверка на нашата конфигурация, където можем да видим какво ще бъде създадено и как е свързано.

  1. Изпълняваме командата - terraform plan -var-file=vcd.tfvars.

  2. Получаваме резултат - Plan: 16 to add, 0 to change, 0 to destroy. Тоест по този план ще бъдат създадени 16 ресурси.

  3. Стартираме плана с команда - terraform.exe apply -var-file=vcd.tfvars.

Виртуалните машини ще бъдат създадени, а след това ще се изпълнят изброените от нас пакети в рамките на секцията provisioner — ОС ще бъде обновена и ще се инсталира CMS Bitrix.

Получаване на данни за свързване

След изпълнението на плана, искаме да получим текстови данни за свързване към сървърите, за това ще оформим секцията output по следния начин:

output "nginxpassword" {

 value = vcdvappvm.nginx.customization[0].adminpassword

}

И следният изход ни съобщава паролата за създадената виртуална машина:

Outputs: nginx_password = F#4u8!!N

В резултат получаваме достъп до виртуалните машини с обновена операционна система и предварително инсталирани пакети за нашата по-нататъшна работа. Всичко е готово!

Но какво, ако вече имате съществуваща инфраструктура?

3.1. Работа на Terraform със съществуваща инфраструктура

Всичко е просто, можете да импортирате текущите виртуални машини и техните vApp контейнери с помощта на командата import.

Опишете ресурса vAPP и виртуалната машина.

resource "vcd_vapp" "Monitoring" {

name = "Monitoring"

org = "mClouds"

vdc = "mClouds"

}

resource "vcd_vapp_vm" "Zabbix" {

name = "Zabbix"

org = "mClouds"

vdc = "mClouds"

vapp = "Monitoring"

}

Следващата стъпка е да импортирате свойствата на ресурсите vApp в формат vcdvapp.<vApp> <org>.<orgvdc>.<vApp>, където:

  • vApp — име на vApp;

  • org — име на организацията;

  • org_vdc — име на виртуалния дата център.

Как да управлявате облачна инфраструктура с TerraformИмпорт на свойства на ресурса vAPP

Изпълнете импорта на свойства на ресурсите VM в формат: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>, в който:

  • VM — име на VM;

  • vApp — име на vApp;

  • org — име на организацията;

  • orgvdc — име на виртуалния дата център.

Импортът премина успешно

C:UsersMikhailDesktopterraform> terraform import vcd_vapp_vm.Zabbix mClouds.mClouds.Monitoring.Zabbix

vcd_vapp_vm.Zabbix: Импорт из ID "mClouds.mClouds.Monitoring.Zabbix"...

vcd_vapp_vm.Zabbix: Импорт подготовлен!

Подготовлен vcd_vapp_vm для импорта

vcd_vapp_vm.Zabbix: Обновление состояния... [id=urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f]

Импорт успешен!

Ресурсите, които бяха импортирани, са показани по-горе. Тези ресурси сега са в
вашето състояние на Terraform и оттук нататък ще бъдат управлявани от Terraform.

Сейчас мы можем посмотреть на новый импортированный ресурс:

Импортированный ресурс

> terraform show

...

# vcd_vapp.Monitoring:

resource "vcd_vapp" "Monitoring" {

guest_properties = {}

href = "https://vcloud.mclouds.ru/api/vApp/vapp-fe5db285-a4af-47c4-93e8-55df92f006ec"

id = "urn:vcloud:vapp:fe5db285-a4af-47c4-93e8-55df92f006ec"

ip = "allocated"

metadata = {}

name = "Monitoring"

org = "mClouds"

status = 4

status_text = "POWERED_ON"

vdc = "mClouds"

}

…

# vcd_vapp_vm.Zabbix:

resource "vcd_vapp_vm" "Zabbix" {

computer_name = "Zabbix"

cpu_cores = 1

cpus = 2

expose_hardware_virtualization = false

guest_properties = {}

hardware_version = "vmx-14"

href = "https://vcloud.mclouds.ru/api/vApp/vm-778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

id = "urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

internal_disk = [

{

номер_на_шина = 0

тип_шина = "paravirtual"

disk_id = "2000"

iops = 0

size_in_mb = 122880

storage_profile = "Gold Storage Policy"

thin_provisioned = true

номер_на_единица = 0

},

]

memory = 8192

metadata = {}

name = "Zabbix"

org = "mClouds"

os_type = "centos8_64Guest"

storage_profile = "Gold Storage Policy"

vapp_name = "Monitoring"

vdc = "mClouds"

customization {

allow_local_admin_password = true

auto_generate_password = true

change_sid = false

enabled = false

force = false

join_domain = false

join_org_domain = false

must_change_password_on_first_login = false

number_of_auto_logons = 0

}

мрежа {

adapter_type = "VMXNET3"

ip_allocation_mode = "DHCP"

is_primary = true

mac = "00:50:56:07:01:b1"

name = "MCLOUDS-LAN01"

type = "org"

}

}

Теперь точно готово — мы закончили с последним моментом (импорт в существующую инфраструктуру) и рассмотрели все основные моменты работы с Terraform. 

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

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

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster