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

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

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

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

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

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

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

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

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

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

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

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

"Терариум" Terraform

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

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

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

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

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

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

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

Доставчици.

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

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

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

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

държави.

Държавните файлове съхраняват информация за конфигурацията на ресурсите на платформата на доставчика. Когато платформата е създадена за първи път, няма информация за ресурсите и преди всяка операция Terraform актуализира състоянието с реалната инфраструктура на вече описаните ресурси.

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

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

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

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

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

Ние ще напишем код и ще го изпълним, използвайки нашия пример облаци на VMware vCloud Director. При нас потребителите получават акаунт с права на организационен администратор, ако използвате акаунт със същите права в друг облак на VMware, можете да възпроизведете кода от нашите примери. Отивам!

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

mkdir project01

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

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

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

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

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

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

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

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

Блокова структура.

<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {

# Block body

<IDENTIFIER> = <EXPRESSION> # Argument

}

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

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

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

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

variable "vcd_org_user" {

  description = "vCD Tenant User"

}

variable "vcd_org_password" {

  description = "vCD Tenant Password"

}

variable "vcd_org" {

  description = "vCD Tenant Org"

}

variable "vcd_org_vdc" {

  description = "vCD Tenant VDC"

}

variable "vcd_org_url" {

  description = "vCD Tenant URL"

}

variable "vcd_org_max_retry_timeout" {

  default = "60"

}

variable "vcd_org_allow_unverified_ssl" {

  default = "true"

}

variable "vcd_org_edge_name" {

  description = "vCD edge name"

}

variable "vcd_org_catalog" {

  description = "vCD public catalog"

}

variable "vcd_template_os_centos7" {

  description = "OS CentOS 7"

  default = "CentOS7"

}

variable "vcd_org_ssd_sp" {

  description = "Storage Policies"

  default = "Gold Storage Policy"

}

variable "vcd_org_hdd_sp" {

  description = "Storage Policies"

  default = "Bronze Storage Policy"

}

variable "vcd_edge_local_subnet" {

  description = "Organization Network Subnet"

}

variable "vcd_edge_external_ip" {

  description = "External public IP"

}

variable "vcd_edge_local_ip_nginx" {}

variable "vcd_edge_local_ip_bitrix" {}

variable "vcd_edge_local_ip_nextcloud" {}

variable "vcd_edge_external_network" {}

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

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

  • vcd_org_password - потребителска парола,

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

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

  • vcd_org_url - URL адрес на API,

  • 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 адрес на виртуалната машина с 1C: Bitrix,

  • 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 адрес на всяка виртуална машина и използвайте Destination NAT, за да "препратите" портове към външната мрежа. За да ограничим достъпа до портовете за управление, ще зададем достъп само за нашия IP адрес.

Как да управлявате облачна инфраструктура с 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"

  }

}

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

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

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]

}

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

След това ще създадем правила, позволяващи достъп до портове от външната мрежа и ще посочим нашия 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]

}

Създайте изходни 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]

}

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

Добавяне на 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"

original_address = var.vcd_edge_external_ip
original_port = 443

translated_address = var.vcd_edge_local_ip_nginx
translated_port = 443
protocol = "tcp"

depends_on = [vcd_network_routed.net]
}
resource "vcd_nsxv_dnat" "dnat_tcp_nginx_http" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

description = "NGINX HTTP"

original_address = var.vcd_edge_external_ip
original_port = 80

translated_address = var.vcd_edge_local_ip_nginx
translated_port = 80
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

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

resource "vcd_nsxv_dnat" "dnat_tcp-nginx_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

description = "SSH NGINX"

original_address = var.vcd_edge_external_ip
original_port = 58301

translated_address = var.vcd_edge_local_ip_nginx
translated_port = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Добавяме NAT правило за превод на порт към SSH сървъра с 1C-Bitrix.

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

description = "SSH Bitrix"

original_address = var.vcd_edge_external_ip
original_port = 58302

translated_address = var.vcd_edge_local_ip_bitrix
translated_port = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

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

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

description = "SSH Nextcloud"

original_address = var.vcd_edge_external_ip
original_port = 58303 translated_address = var.vcd_edge_local_ip_nextcloud
translated_port = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

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

Както планирахме в началото на статията, ще създадем три виртуални машини. Те ще бъдат изготвени с „Персонализиране за гости“. Ще напишем мрежовите параметри според зададените от нас настройки, а паролата от потребителя се генерира автоматично.

Нека опишем vApp, в който ще бъдат разположени виртуалните машини и тяхната конфигурация.

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

Нека създадем vApp контейнер. За да можем незабавно да свържем vApp и VM към виртуалната мрежа, ние също добавяме параметъраdependent_on:

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

resource "vcd_vapp" "vapp" {
name = "web"
power_on = "true" depends_on = [vcd_network_routed.net]

}

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

resource "vcd_vapp_vm" "nginx" {

vapp_name = vcd_vapp.vapp.name

name = "nginx"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_nginx

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "32768"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

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

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

  • vappname - името на vApp, в което да добавите нова VM,

  • име на каталог / име на шаблон - име на каталог и име на шаблон на виртуална машина,

  • storageprofile - правила за съхранение по подразбиране.

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

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

  • име - към коя виртуална мрежа да се свърже VM,

  • isprimary - основен мрежов адаптер,

  • ipallocation_mode - РЪЧЕН / DHCP / POOL режим на разпределяне на адреси,

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

override_template_disk блок:

  • sizeinmb - размер на диска за стартиране на виртуалната машина

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

Нека създадем втора виртуална машина с описание на файловото хранилище Nextcloud

resource "vcd_vapp_vm" "nextcloud" {

vapp_name = vcd_vapp.vapp.name

name = "nextcloud"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_nextcloud

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "32768"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

resource "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 на Bitrix

resource "vcd_vapp_vm" "bitrix" {

vapp_name = vcd_vapp.vapp.name

name = "bitrix"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_bitrix

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "81920"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

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

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

Нека да разгледаме как да актуализираме операционната система и да стартираме инсталационния скрипт на Bitrix CMS, като използваме блока за осигуряване.

Нека първо инсталираме сервизните пакети на CentOS.

resource "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" ]

}

}

}

Обозначение на компонентите:

  • provider "remote-exec" - свържете отдалечения блок "provisioning".

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

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

  • потребител - потребителско име;

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

  • хост — външен IP адрес за връзка;

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

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

Като пример, нека допълнително изпълним инсталационния скрипт на 1C-Bitrix. Резултатът от резултата от изпълнението на скрипта ще бъде наличен по време на изпълнението на плана. За да инсталираме скрипта, първо описваме блока:

Нека опишем инсталирането на 1C-Bitrix.

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"

]

}

И веднага ще опишем актуализацията на Bitrix.

Пример за осигуряване на 1C-Bitrix.

resource "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 1C-Bitrix с помощта на 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.

Ще бъдат създадени виртуални машини и след това изброените от нас пакети ще бъдат изпълнени в раздела за осигуряване - операционната система ще бъде актуализирана и CMS Bitrix ще бъде инсталиран.

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

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

output "nginxpassword" {

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

}

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

Outputs: nginx_password = F#4u8!!N

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

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

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

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

Нека опишем 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: Importing from ID "mClouds.mClouds.Monitoring.Zabbix"...

vcd_vapp_vm.Zabbix: Import prepared!

Prepared vcd_vapp_vm for import

vcd_vapp_vm.Zabbix: Refreshing state... [id=urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by 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 = [

{

bus_number = 0

bus_type = "paravirtual"

disk_id = "2000"

iops = 0

size_in_mb = 122880

storage_profile = "Gold Storage Policy"

thin_provisioned = true

unit_number = 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

}

network {

adapter_type = "VMXNET3"

ip_allocation_mode = "DHCP"

is_primary = true

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

name = "MCLOUDS-LAN01"

type = "org"

}

}

Сега определено сме готови - приключихме с последния момент (импортиране в съществуваща инфраструктура) и разгледахме всички основни точки на работа с Terraform. 

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

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

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

Добавяне на нов коментар