Cum să gestionați infrastructura cloud cu Terraform.

Cum să gestionați infrastructura cloud cu Terraform.

În acest articol, vom examina din ce este compus Terraform și vom lansa pas cu pas propria infrastructură în cloud cu VMware — va pregăti trei VM-uri pentru scopuri diferite: proxy, stocare de fișiere și CMS.

Despre toate în detaliu și în trei etape:

1. Terraform — descriere, avantaje și componente

Terraform este un instrument IaC (Infrastructure-as-Code) pentru construirea și gestionarea infrastructurii virtuale prin cod.

În utilizarea acestui instrument, am observat câteva avantaje:

  • Viteza de desfășurare a noilor clienți (medii virtuale personalizate). De obicei, cu cât sunt mai mulți clienți noi, cu atât mai multe „click-uri” trebuie să facă angajații suportului tehnic pentru a publica noi resurse. Folosind Terraform, utilizatorii pot modifica parametrii mașinilor virtuale (de exemplu, pot opri automat sistemul de operare și pot extinde partiția discului virtual) fără a necesita suport tehnic și oprirea efectivă a mașinii.

  • Verificarea instantanee a planului de activare al noului client. Cu ajutorul descrierii codului infrastructurii, putem verifica imediat ce și în ce ordine va fi adăugat, precum și în ce stare finală va fi o anumită mașină virtuală sau o rețea virtuală conectată la mașinile virtuale.

  • Posibilitatea de a descrie majoritatea platformelor cloud populare. Puteți utiliza instrumentul de la Amazon și Google Cloud, până la platforme private bazate pe VMware vCloud Director, care oferă servicii în cadrul soluțiilor IaaS, SaaS și PaaS.

  • Gestionarea mai multor furnizori cloud și distribuirea infrastructurii între aceștia pentru a crește reziliența, folosind o singură configurație pentru a crea, diagnostica și gestiona resursele cloud.

  • Utilizare convenabilă pentru crearea demo-standurilor pentru testarea și depanarea software-ului. Puteți crea și transfera standuri pentru departamentul de testare, verifica simultan software-ul în medii diferite și, de asemenea, modifica și șterge instantaneu resursele, creând doar un singur plan de construcție a resurselor

„Terarium” Terraform

Am menționat pe scurt avantajele instrumentului, acum să discutăm componentele sale

Providers (furnizori). 

În Terraform, aproape orice tip de infrastructură poate fi reprezentat ca un resursă. Legătura între resurse și API-ul platformei este asigurată de modulele providers care permit crearea de resurse în cadrul unei platforme specifice, cum ar fi Azure sau VMware vCloud Director.

În cadrul proiectului, puteți interacționa cu diferiți furnizori pe diferite platforme.

Resources (descrierea resurselor).

Descrierea resurselor permite gestionarea componentelor platformei, cum ar fi mașinile virtuale sau rețelele. 

Puteți crea singur o descriere a resurselor pentru furnizorul VMware vCloud Director și utiliza această descriere pentru a crea resurse la orice furnizor de hosting care utilizează vCloud Director. Va trebui doar să înlocuiți parametrii de autentificare și parametrii de conectare la rețea pentru furnizorul de hosting necesar.

Provisioners.

Această componentă permite efectuarea operațiunilor de instalare inițială și întreținere a sistemului de operare după crearea mașinilor virtuale. După ce ați creat resursa unei mașini virtuale, cu ajutorul provisioners puteți configura și conecta prin SSH, efectua actualizări ale sistemului de operare și încărca și executa un script. 

Variabilele Input și Output.

Variabilele Input sunt variabilele de intrare pentru orice tipuri de blocuri. 

Variabilele Output permit salvarea valorilor după crearea resurselor și pot fi utilizate ca variabile de intrare în alte module, cum ar fi blocul Provisioners.

States (stări).

Fișierele States stochează informații despre configurația resurselor platformei furnizorului. La prima creare a platformei, nu există informații despre resurse, iar înainte de orice operație Terraform actualizează starea cu infrastructura reală a resurselor deja descrise.

Scopul principal al stărilor este de a salva legătura obiectelor deja create pentru a compara configurația resurselor adăugate și a obiectelor, pentru a evita recrearea și modificările platformei.

Informațiile despre stare sunt, în mod implicit, stocate într-un fișier local terraform.tfstate, dar, dacă este necesar, există posibilitatea de a utiliza stocarea la distanță pentru a lucra în echipă.

De asemenea, puteți importa resursele curente ale platformei într-o stare pentru a interacționa ulterior cu alte resurse care, la rândul lor, au fost create fără ajutorul Terraform.  

2. Crearea infrastructurii

Componentele au fost discutate, acum folosind Terraform, vom crea pas cu pas infrastructura cu trei mașini virtuale. Prima va avea un server proxy nginx instalat, a doua va avea un spațiu de stocare pe baza Nextcloud și a treia va avea CMS Bitrix.

Vom scrie cod și îl vom executa folosind exemplul nostru de cloud pe VMware vCloud Director.Utilizatorii noștri primesc un cont cu drepturi de Administrator al Organizației, dacă folosiți un cont cu aceleași drepturi într-un alt cloud VMware, veți putea reproduce codul din exemplele noastre. Să începem!

Mai întâi, vom crea un director pentru noul nostru proiect, în care vor fi plasate fișierele cu descrierea infrastructurii.

mkdir project01

Apoi vom descrie componentele infrastructurii. Terraform creează conexiuni și prelucrează fișierele pe baza descrierii din fișiere. Fișierele în sine pot fi denumite în funcție de destinația block-urilor descrise, de exemplu, network.tf - descrie parametrii rețelei pentru infrastructură.

Pentru a descrie componentele infrastructurii noastre, am creat următoarele fișiere:

Lista fișierelor.

main.tf - descrierea parametrelor pentru mediul virtual - mașini virtuale, containere virtuale;

network.tf - descrierea parametrilor rețelei virtuale și a regulilor NAT, Firewall;

variables.tf - lista variabilelor pe care le folosim;

vcd.tfvars - valorile variabilelor proiectului pentru modulul VMware vCloud Director.

Limbajul de configurare în Terraform este declarativ, iar ordinea block-urilor nu are importanță, cu excepția block-ului provisioner, deoarece în acest block descriem comenzile pentru executarea în pregătirea infrastructurii și acestea vor fi executate în ordine.

Structura block-urilor.

"" "" {

# Block body

= # Argument

}

Pentru descrierea block-urilor se folosește propriul limbaj de programare HCL (HashiCorp Configuration Language), este posibilă descrierea infrastructurii și cu ajutorul JSON. Mai multe despre sintaxă puteți citi pe site-ul dezvoltatorului.

Configurația variabilei de mediu, variables.tf și vcd.tfvars

Mai întâi vom crea două fișiere care descriu lista tuturor variabilelor utilizate și valorile lor pentru modulul VMware vCloud Director. Primul va fi fișierul variables.tf.

Conținutul fișierului variables.tf.

variabilă "vcd_org_user" {

  descriere = "Utilizator vCD Tenant"

}

variabilă "vcd_org_password" {

  descriere = "Parola vCD Tenant"

}

variabilă "vcd_org" {

  descriere = "Organizația vCD Tenant"

}

variabilă "vcd_org_vdc" {

  descriere = "VDC vCD Tenant"

}

variabilă "vcd_org_url" {

  descriere = "URL vCD Tenant"

}

variabilă "vcd_org_max_retry_timeout" {

  implicit = "60"

}

variabilă "vcd_org_allow_unverified_ssl" {

  implicit = "adevărat"

}

variabilă "vcd_org_edge_name" {

  descriere = "numele edge-ului vCD"

}

variabilă "vcd_org_catalog" {

  descriere = "catalog public vCD"

}

variabilă "vcd_template_os_centos7" {

  descriere = "OS CentOS 7"

  implicit = "CentOS7"

}

variabilă "vcd_org_ssd_sp" {

  descriere = "Politici de stocare"

  implicit = "Politica de stocare de aur"

}

variabilă "vcd_org_hdd_sp" {

  descriere = "Politici de stocare"

  implicit = "Politica de stocare de bronz"

}

variabilă "vcd_edge_local_subnet" {

  descriere = "Subrețeaua Organizației"

}

variabilă "vcd_edge_external_ip" {

  descriere = "IP public extern"

}

variabilă "vcd_edge_local_ip_nginx" {}

variabilă "vcd_edge_local_ip_bitrix" {}

variabilă "vcd_edge_local_ip_nextcloud" {}

variabilă "vcd_edge_external_network" {}

Valorile variabilelor pe care le primim de la furnizor.

  • vcd_org_user — numele utilizatorului cu drepturi de Administrator al Organizației,

  • vcd_org_password — parola utilizatorului,

  • vcd_org — numele organizației,

  • vcd_org_vdc — numele centrului de date virtual,

  • vcd_org_url — URL API,

  • vcd_org_edge_name — numele router-ului virtual,

  • vcd_org_catalog — numele catalogului cu șabloane de mașini virtuale,

  • vcd_edge_external_ip — adresa IP publică,

  • vcd_edge_external_network — numele rețelei externe,

  • vcd_org_hdd_sp — numele politicii de stocare HDD,

  • vcd_org_ssd_sp — numele politicii de stocare SSD.

Și introducem propriile variabile:

  • vcd_edge_local_ip_nginx — adresa IP a mașinii virtuale cu NGINX,

  • vcd_edge_local_ip_bitrix — adresa IP a mașinii virtuale cu 1C: Bitrix,

  • vcd_edge_local_ip_nextcloud — adresa IP a mașinii virtuale cu Nextcloud.

În al doilea fișier creăm și specificăm variabile pentru modulul VMware vCloud Director în fișierul vcd.tfvars: Să ne amintim că în exemplul nostru folosim cloud-ul nostru mClouds, dacă lucrați cu un alt furnizor, verificați valorile cu acesta. 

Conținutul fișierului vcd.tfvars.

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

vcd_org_user = "orgadmin"

vcd_org_password = "*"

vcd = "org"

vcd_org_vdc = "orgvdc"

vcd_org_maxretry_timeout = 60

vcd_org_allow_unverified_ssl = adevărat

vcd_org_catalog = "Templates"

vcd_templateos_centos7 = "CentOS7"

vcd_org_ssd_sp = "Politica de stocare de aur"

vcd_org_hdd_sp = "Politica de stocare de bronz"

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"

Configurația rețelei, network.tf.

Variabilele de mediu sunt setate, acum să configurăm schema de conectare a mașinilor virtuale — vom aloca o adresă IP privată pentru fiecare mașină virtuală și vom utiliza Destination NAT pentru a redirecționa porturile către rețeaua externă. Pentru a restricționa accesul la porturile de control, vom permite accesul doar pentru adresa noastră IP.

Cum să gestionați infrastructura cloud cu Terraform.Schema de rețea pentru platforma Terraform creată

Creăm o rețea organizațională virtuală numită net_lan01, cu un gateway implicit: 192.168.110.254, precum și cu un spațiu de adresare: 192.168.110.0/24.

Definim rețeaua virtuală.

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"

  }

}

Vom crea reguli pentru firewall care permit accesul mașinilor virtuale la rețeaua Internet. În cadrul acestui bloc, toate resursele virtuale din cloud vor avea acces la Internet:

Definim regulile pentru accesul VM la Internet.

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]

}

Stabilind o dependență, după ce blocul vcdnetworkrouted.net este procesat, vom trece la configurarea blocului vcdnsxvfirewallrule, prin dependson. Folosim această opțiune, deoarece unele dependențe pot fi recunoscute implicit în configurație.

Apoi vom crea reguli care permit accesul la porturi din rețeaua externă și specificăm adresa noastră IP pentru conectarea prin SSH la servere. Orice utilizator din rețeaua Internet are acces la porturile 80 și 443 pe serverul web, iar utilizatorul cu adresa IP 90.1.15.1 are acces la porturile SSH ale serverelor virtuale.

Permitem accesul la porturi din rețeaua externă.

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]

}

Creăm reguli Source NAT pentru accesul la rețeaua Internet din rețeaua locală cloud:

Definim regulile 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]

}

Și la finalul configurației blocului de rețele, adăugăm reguli Destination NAT pentru accesul la serviciile din rețeaua externă:

Adăugăm reguli 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"

adresa_originală = var.vcd_edge_external_ip
port_original = 443

adresa_tradusă = var.vcd_edge_local_ip_nginx
port_tradus = 443
protocol = "tcp"

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

descriere = "NGINX HTTP"

adresa_originală = var.vcd_edge_external_ip
port_original = 80

adresa_tradusă = var.vcd_edge_local_ip_nginx
port_tradus = 80
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Adăugăm o regulă NAT pentru traducerea porturilor către serverul SSH sub Nginx.

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

descriere = "SSH NGINX"

adresa_originală = var.vcd_edge_external_ip
port_original = 58301

adresa_tradusă = var.vcd_edge_local_ip_nginx
port_tradus = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Adăugăm o regulă NAT pentru traducerea porturilor către serverul SSH cu 1C-Bitrix.

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

descriere = "SSH Bitrix"

adresa_originală = var.vcd_edge_external_ip
port_original = 58302

adresa_tradusă = var.vcd_edge_local_ip_bitrix
port_tradus = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Adăugăm o regulă NAT pentru traducerea porturilor către serverul SSH cu Nextcloud.

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

descriere = "SSH Nextcloud"

adresa_originală = var.vcd_edge_external_ip
port_original = 58303 adresa_tradusă = var.vcd_edge_local_ip_nextcloud
port_tradus = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Configurarea mediului virtual main.tf

Așa cum am planificat la începutul articolului, vom crea trei mașini virtuale. Acestea vor fi pregătite folosind „Guest Customization”. Parametrii rețelei vor fi specificați conform setărilor menționate de noi, iar parola pentru utilizator va fi generată automat.

Vom descrie vApp-ul în care se vor afla mașinile virtuale și configurația acestora.

Cum să gestionați infrastructura cloud cu Terraform.Configurarea mașinilor virtuale

Vom crea un container vApp. Astfel, putem conecta imediat vApp-ul și VM-urile la rețeaua virtuală, adăugând de asemenea parametrul depends_on:

Creăm containerul

resursa "vcd_vapp" "vapp" {
nume = "web"
pornire = "true" depends_on = [vcd_network_routed.net]

}

Vom crea o mașină virtuală cu descrierea

resursa "vcd_vapp_vm" "nginx" {

nume_vapp = vcd_vapp.vapp.name

nume = "nginx"

nume_catalog = var.vcd_org_catalog

nume_template = var.vcd_template_os_centos7

profil_stocare = var.vcd_org_ssd_sp

memorie = 8192

cpus = 1

miezuri_cpu = 1

rețea {

tip = "org"

nume = vcd_network_routed.net.name

este_principal = true

tip_adaptor = "VMXNET3"

mod_alocare_ip = "MANUAL"

ip = var.vcd_edge_local_ip_nginx

}

suprascriere_template_disk {

tip_bus = "paravirtual"

dimensiune_in_mb = "32768"

număr_bus = 0

număr_unitate = 0

profil_stocare = var.vcd_org_ssd_sp

}

}

Parametrii principali în descrierea VM:

  • nume — numele mașinii virtuale,

  • nume_vapp — denumirea vApp în care se va adăuga noul VM,

  • nume_catalog / nume_template — numele catalogului și numele șablonului pentru mașina virtuală,

  • profil_stocare — politica de stocare implicită.

Parametrii blocului rețea:

  • tip — tipul rețelei conectate,

  • nume — la ce rețea virtuală se va conecta VM,

  • este_principal — adaptorul de rețea principal,

  • mod_alocare_ip — modul de alocare a adresei MANUAL / DHCP / POOL,

  • ip — adresa IP pentru mașina virtuală, pe care o vom specifica manual.

Blocul suprascriere_template_disk:

  • dimensiuneinmb — dimensiunea boot-diskului pentru mașina virtuală

  • profil_stocare — politica de stocare pentru disk

Vom crea a doua VM cu descrierea stocării fișierelor Nextcloud

resursa "vcd_vapp_vm" "nextcloud" {

nume_vapp = vcd_vapp.vapp.name

nume = "nextcloud"

nume_catalog = var.vcd_org_catalog

nume_template = var.vcd_template_os_centos7

profil_stocare = var.vcd_org_ssd_sp

memorie = 8192

cpus = 1

miezuri_cpu = 1

rețea {

tip = "org"

nume = vcd_network_routed.net.name

este_principal = true

tip_adaptor = "VMXNET3"

mod_alocare_ip = "MANUAL"

ip = var.vcd_edge_local_ip_nextcloud

}

suprascriere_template_disk {

tip_bus = "paravirtual"

dimensiune_in_mb = "32768"

număr_bus = 0

număr_unitate = 0

profil_stocare = 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 ]

}

În secțiunea vcdvminternal_disk vom descrie un nou disc virtual, care se conectează la mașina virtuală.

Explicații pentru blocul vcdvminternaldisk:

  • bustype — tipul controlerului de disc

  • sizeinmb — dimensiunea discului

  • busnumber / unitnumber — locul de conectare în adaptor

  • profil_stocare — politica de stocare pentru disk

Vom descrie ultima VM pe Bitrix

resource "vcd_vapp_vm" "bitrix" {

nume_vapp = vcd_vapp.vapp.name

name = "bitrix"

nume_catalog = var.vcd_org_catalog

nume_template = var.vcd_template_os_centos7

profil_stocare = var.vcd_org_ssd_sp

memorie = 8192

cpus = 1

miezuri_cpu = 1

rețea {

tip = "org"

nume = vcd_network_routed.net.name

este_principal = true

tip_adaptor = "VMXNET3"

mod_alocare_ip = "MANUAL"

ip = var.vcd_edge_local_ip_bitrix

}

suprascriere_template_disk {

tip_bus = "paravirtual"

size_in_mb = "81920"

număr_bus = 0

număr_unitate = 0

profil_stocare = var.vcd_org_ssd_sp

}

}

Actualizarea sistemului de operare și instalarea scripturilor suplimentare

Rețeaua este pregătită, mașinile virtuale sunt descrise. Înainte de a importa infrastructura noastră, putem efectua o provizionare inițială folosind blocurile de provisioneri și fără a folosi Ansible.

Să vedem cum se actualizează sistemul de operare și se lansează scriptul de instalare CMS Bitrix cu ajutorul blocului provisioner.

Mai întâi, vom instala pachetele de actualizare pentru 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" ]

}

}

}

Definiția componentelor:

  • provisioner «remote-exec» — ne conectăm cu blocul de provizionare la distanță

  • În blocul connection descriem tipul și parametrii pentru conectare:

  • type — protocolul, în cazul nostru SSH;

  • user — numele utilizatorului;

  • password — parola utilizatorului. În cazul nostru, ne referim la parametrul vcdvappvm.nginx.customization[0].admin_password, care stochează parola generată pentru utilizatorul sistemului.

  • host — adresa IP externă pentru conectare;

  • port — portul pentru conectare, care a fost specificat anterior în setările DNAT;

  • inline — enumerăm lista de comenzi care vor fi introduse. Comenzile vor fi introduse în ordinea specificată în această secțiune.

Ca exemplu, vom efectua suplimentar scriptul de instalare 1C-Bitrix. Ieșirea rezultatului execuției scriptului va fi disponibilă în timpul execuției planului. Pentru a instala scriptul, mai întâi vom descrie blocul:

Vom descrie instalarea 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"

]

}

Și imediat vom descrie actualizarea Bitrix.

Exemplu de provizionare 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"

]

}

}

Important! The script may not work if SELinux is not disabled in advance! If you need a detailed article on installing and configuring CMS 1C-Bitrix using bitrix-env.sh, you can use our article in the blog on the website.

3. Infrastructure Initialization

Cum să gestionați infrastructura cloud cu Terraform.Initialization of modules and plugins

For this task, we use a simple 'gentleman's set': a laptop with Windows 10 and a distribution from the official site terraform.io. We will unpack and initialize it with the following command: terraform.exe init

After describing the computational and network infrastructure, we run the planning to check our configuration, where we can see what will be created and how they are interconnected.

  1. We execute the command - terraform plan -var-file=vcd.tfvars.

  2. We receive the result - Plan: 16 to add, 0 to change, 0 to destroy. So, according to this plan, 16 resources will be created.

  3. We start the plan with the command - terraform.exe apply -var-file=vcd.tfvars.

The virtual machines will be created, and then the packages we listed in the provisioner section will be executed — the OS will be updated and CMS Bitrix will be installed.

Fetching connection data

After executing the plan, we want to obtain the connection data for the servers in text format; for this, we will format the output section as follows:

output "nginxpassword" {

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

}

And the next output provides us with the password for the created virtual machine:

Outputs: nginx_password = F#4u8!!N

As a result, we gain access to virtual machines with the updated operating system and pre-installed packages for our further work. Everything is ready!

But what if you already have an existing infrastructure?

3.1. Working with Terraform in an Existing Infrastructure

It's simple, you can import the current virtual machines and their vApp containers using the import command.

Let's describe the vAPP resource and the virtual machine.

resource "vcd_vapp" "Monitoring" {

name = "Monitoring"

org = "mClouds"

vdc = "mClouds"

}

resource "vcd_vapp_vm" "Zabbix" {

name = "Zabbix"

org = "mClouds"

vdc = "mClouds"

vapp = "Monitoring"

}

The next step is to import the properties of the vApp resources in the format vcdvapp. .., unde:

  • vApp — name of the vApp;

  • org — name of the organization;

  • org_vdc — name of the virtual data center.

Cum să gestionați infrastructura cloud cu Terraform.Importing vAPP resource properties

We will import the properties of the VM resources in the format: vcdvappvm. ..., în care:

  • VM — name of the VM;

  • vApp — name of the vApp;

  • org — name of the organization;

  • orgvdc — name of the virtual data center.

The import was successful.

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

vcd_vapp_vm.Zabbix: Importare din ID "mClouds.mClouds.Monitoring.Zabbix"...

vcd_vapp_vm.Zabbix: Import pregătit!

vcd_vapp_vm pregătit pentru import

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

Importare reușită!

Resursele importate sunt afișate mai sus. Aceste resurse sunt acum în
starea dumneavoastră Terraform și vor fi gestionate de Terraform de acum înainte.

Acum putem examina noua resursă importată:

Resursă importată

> terraform show

...

# vcd_vapp.Monitoring:

resource "vcd_vapp" "Monitoring" {

guest_properties = {}

href = "https://vcloud.mclouds.ro/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.ro/api/vApp/vm-778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

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

internal_disk = [

{

număr_bus = 0

tip_bus = "paravirtual"

disk_id = "2000"

iops = 0

size_in_mb = 122880

storage_profile = "Gold Storage Policy"

thin_provisioned = true

număr_unitate = 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

}

rețea {

adapter_type = "VMXNET3"

ip_allocation_mode = "DHCP"

is_primary = true

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

name = "MCLOUDS-LAN01"

type = "org"

}

}

Acum este sigur gata — am finalizat cu ultimul detaliu (importul în infrastructura existentă) și am discutat toate aspectele principale legate de utilizarea Terraform. 

Instrumentul s-a dovedit a fi foarte util și permite descrierea infrastructurii dvs. ca un cod, începând de la mașinile virtuale ale unui furnizor de cloud până la descrierea resurselor componentelor de rețea.

În plus, independența de mediu permite lucrul atât cu resursele locale, cât și cu cele de cloud și, când nu există o platformă suportată, se poate scrie un propriul furnizor și folosi.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster