Në këtë artikull ne do të shikojmë se nga çfarë përbëhet Terraform, dhe gjithashtu do të hapim gradualisht infrastrukturën tonë
Për gjithçka në detaje dhe në tre faza:
1. Terraform - përshkrimi, avantazhet dhe komponentët
Terraform është një mjet IaC (Infrastructure-as-Code) për ndërtimin dhe menaxhimin e infrastrukturës virtuale duke përdorur kodin.
Ne vumë re disa përparësi në punën me mjetin:
-
Shpejtësia e vendosjes së qiramarrësve të rinj (mjedise virtuale të personalizuara). Në mënyrë tipike, sa më shumë klientë të rinj të ketë, aq më shumë "klikime" duhet të bëjë stafi i ndihmës teknike për të publikuar burime të reja. Me Terraform, përdoruesit mund të ndryshojnë cilësimet e makinës virtuale (për shembull, mbyllja automatike e sistemit operativ dhe rritja e ndarjes së diskut virtual) pa kërkuar mbështetje teknike ose pa fikur vetë makinën.
-
Verifikimi i menjëhershëm i planit të aktivizimit Qiramarrës i ri. Duke përdorur përshkrimin e kodit të infrastrukturës, ne mund të kontrollojmë menjëherë se çfarë do të shtohet dhe në çfarë rendi, si dhe në çfarë gjendje përfundimtare do të jetë kjo apo ajo makinë virtuale ose rrjet virtual me lidhje me makinat virtuale.
-
Aftësia për të përshkruar platformat më të njohura të cloud. Ju mund të përdorni mjetin nga Amazon dhe Google Cloud, në platformat private të bazuara në VMware vCloud Director, duke ofruar shërbime brenda zgjidhjeve IaaS, SaaS dhe PaaS.
-
Menaxho ofrues të shumtë të reve kompjuterike dhe shpërndani infrastrukturën midis tyre për të përmirësuar tolerancën ndaj gabimeve, duke përdorur një konfigurim të vetëm për të krijuar, diagnostikuar dhe menaxhuar burimet e resë kompjuterike.
-
Përdorim i përshtatshëm për krijimin e stendave demo për testimin dhe korrigjimin e softuerit. Mund të krijoni dhe transferoni stendat për departamentin e testimit, të testoni softuerin në mjedise të ndryshme paralelisht dhe të ndryshoni dhe fshini menjëherë burimet duke krijuar vetëm një plan ndërtimi burimesh
"Terrarium" Terraform
Ne folëm shkurtimisht për avantazhet e mjetit, tani le ta ndajmë atë në përbërësit e tij
Ofruesit.
Në Terraform, pothuajse çdo lloj infrastrukture mund të përfaqësohet si një burim. Lidhja midis burimeve dhe platformës API sigurohet nga modulet e ofruesit, të cilat ju lejojnë të krijoni burime brenda një platforme specifike, për shembull, Azure ose VMware vCloud Director.
Si pjesë e projektit, ju mund të ndërveproni me ofrues të ndryshëm në platforma të ndryshme.
Burimet (përshkrimi i burimit).
Përshkrimi i burimeve ju lejon të menaxhoni komponentët e platformës, të tilla si makinat virtuale ose rrjetet.
Ju mund të krijoni vetë një përshkrim burimi për ofruesin e VMware vCloud Director dhe përdorni këtë përshkrim për të krijuar burime me çdo ofrues pritës që përdor vCloud Director. Ju vetëm duhet të ndryshoni parametrat e vërtetimit dhe parametrat e lidhjes së rrjetit në ofruesin e kërkuar të pritjes
Ofruesit.
Ky komponent bën të mundur kryerjen e operacioneve për instalimin fillestar dhe mirëmbajtjen e sistemit operativ pas krijimit të makinave virtuale. Pasi të keni krijuar një burim të makinës virtuale, mund të përdorni ofruesit për të konfiguruar dhe lidhur nëpërmjet SSH, për të përditësuar sistemin operativ dhe për të shkarkuar dhe ekzekutuar një skript.
Variablat hyrëse dhe dalëse.
Variablat hyrëse - variablat hyrëse për çdo lloj blloku.
Variablat e daljes ju lejojnë të ruani vlerat pas krijimit të burimeve dhe mund të përdoren si variabla hyrëse në module të tjera, për shembull në bllokun Provisioners.
shtetet.
Skedarët e shteteve ruajnë informacione rreth konfigurimit të burimeve të platformës së ofruesit. Kur platforma krijohet për herë të parë, nuk ka asnjë informacion për burimet dhe para çdo operacioni, Terraform përditëson gjendjen me infrastrukturën reale të burimeve të përshkruara tashmë.
Qëllimi kryesor i shteteve është të ruajnë një sërë objektesh të burimeve të krijuara tashmë për të krahasuar konfigurimin e burimeve dhe objekteve të shtuara në mënyrë që të shmanget krijimi i përsëritur dhe ndryshimet në platformë.
Si parazgjedhje, informacioni i gjendjes ruhet në skedarin lokal terraform.tfstate, por nëse është e nevojshme, është e mundur të përdoret ruajtja në distancë për punën ekipore.
Ju gjithashtu mund të importoni burimet aktuale të platformës në gjendje për të bashkëvepruar më tej me burime të tjera që u krijuan pa ndihmën e Terraform.
2. Krijimi i infrastrukturës
Komponentët janë renditur, tani duke përdorur Terraform do të krijojmë gradualisht një infrastrukturë me tre makina virtuale. E para me serverin proxy nginx të instaluar, e dyta me ruajtjen e skedarëve bazuar në Nextcloud dhe e treta me CMS Bitrix.
Ne do të shkruajmë kodin dhe do ta ekzekutojmë duke përdorur shembullin tonë
Së pari, le të krijojmë një direktori për projektin tonë të ri në të cilin do të vendosen skedarët që përshkruajnë infrastrukturën.
mkdir project01
Më pas, ne përshkruajmë komponentët e infrastrukturës. Terraform krijon marrëdhënie dhe përpunon skedarë bazuar në përshkrimin në skedarë. Vetë skedarët mund të emërtohen në bazë të qëllimit të blloqeve që përshkruhen, për shembull, network.tf - përshkruan parametrat e rrjetit për infrastrukturën.
Për të përshkruar komponentët e infrastrukturës sonë, ne krijuam skedarët e mëposhtëm:
Lista e dosjeve.
main.tf - përshkrimi i parametrave për mjedisin virtual - makinat virtuale, kontejnerët virtualë;
network.tf - përshkrim i parametrave të rrjetit virtual dhe rregullave NAT dhe Firewall;
variables.tf - lista e variablave që përdorim;
vcd.tfvars - vlerat e variablave të projektit për modulin VMware vCloud Director.
Gjuha e konfigurimit në Terraform është deklarative dhe rendi i blloqeve nuk ka rëndësi, përveç blloqeve të ofruesit, sepse në këtë bllok përshkruajmë komandat që duhen ekzekutuar gjatë përgatitjes së infrastrukturës dhe ato do të ekzekutohen sipas radhës.
Struktura e bllokut.
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
Për të përshkruar blloqet, përdoret gjuha e tij e programimit HCL (HashiCorp Configuration Language); është e mundur të përshkruhet infrastruktura duke përdorur JSON. Mund të mësoni më shumë rreth sintaksës
Konfigurimi i variablave të mjedisit, variables.tf dhe vcd.tfvars
Së pari, le të krijojmë dy skedarë që përshkruajnë listën e të gjitha variablave të përdorur dhe vlerat e tyre për modulin VMware vCloud Director. Së pari, le të krijojmë skedarin variables.tf.
Përmbajtja e skedarit 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" {}
Vlerat e ndryshueshme që marrim nga ofruesi.
-
vcd_org_user — emri i përdoruesit me të drejtat e Administratorit të Organizatës,
-
vcd_org_password — fjalëkalimi i përdoruesit,
-
vcd_org - emri i organizatës,
-
vcd_org_vdc - emri i qendrës virtuale të të dhënave,
-
vcd_org_url - URL e API-së,
-
vcd_org_edge_name — emri i ruterit virtual,
-
vcd_org_catalog — emri i drejtorisë me shabllone të makinës virtuale,
-
vcd_edge_external_ip - adresa IP publike,
-
vcd_edge_external_network — emri i rrjetit të jashtëm,
-
vcd_org_hdd_sp — emri i politikës së ruajtjes së HDD,
-
vcd_org_ssd_sp — emri i politikës së ruajtjes SSD.
Dhe futni variablat tona:
-
vcd_edge_local_ip_nginx — Adresa IP e makinës virtuale me NGINX,
-
vcd_edge_local_ip_bitrix - Adresa IP e makinës virtuale me 1C: Bitrix,
-
vcd_edge_local_ip_nextcloud — Adresa IP e makinës virtuale me Nextcloud.
Me skedarin e dytë krijojmë dhe specifikojmë variabla për modulin VMware vCloud Director në skedarin vcd.tfvars: Le të kujtojmë se në shembullin tonë ne përdorim
Përmbajtja e skedarit 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"
Konfigurimi i rrjetit, network.tf.
Variablat e mjedisit janë vendosur, tani ne do të konfigurojmë skemën e lidhjes së makinës virtuale - do t'i caktojmë një adresë IP private secilës makinë virtuale dhe do të përdorim Destination NAT për të "përcjellur" portet në rrjetin e jashtëm. Për të kufizuar aksesin në portet e menaxhimit, ne do të vendosim akses vetëm për adresën tonë IP.
Diagrami i rrjetit për platformën Terraform që po krijohet
Ne krijojmë një rrjet organizativ virtual me emrin net_lan01, portën e paracaktuar: 192.168.110.254, dhe gjithashtu me hapësirën e adresës: 192.168.110.0/24.
Ne përshkruajmë një rrjet 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"
}
}
Le të krijojmë rregulla të murit të zjarrit që lejojnë makinat virtuale të hyjnë në internet. Brenda këtij blloku, të gjitha burimet virtuale në cloud do të kenë akses në internet:
Ne përshkruajmë rregullat për hyrjen e VM në 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]
}
Pasi kemi vendosur varësinë që pas përpunimit të bllokut vcdnetworkrouted.net, ne vazhdojmë të konfigurojmë bllokun vcdnsxvfirewallrule, со помощью varet nga. Ne e përdorim këtë opsion sepse disa varësi mund të njihen në mënyrë implicite në konfigurim.
Më pas, ne do të krijojmë rregulla që lejojnë hyrjen në portet nga rrjeti i jashtëm dhe do të tregojmë adresën tonë IP për t'u lidhur me serverët përmes SSH. Çdo përdorues i internetit ka akses në portat 80 dhe 443 në serverin e internetit dhe një përdorues me një adresë IP prej 90.1.15.1 ka akses në portat SSH të serverëve virtualë.
Lejo qasjen në portet nga rrjeti i jashtëm.
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]
}
Ne krijojmë rregullat e burimit NAT për të hyrë në internet nga një rrjet lokal cloud:
Ne përshkruajmë rregullat e Burimit 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]
}
Dhe për të përfunduar konfigurimin e bllokut të rrjetit, ne shtojmë rregullat e Destinacionit NAT për të hyrë në shërbime nga rrjeti i jashtëm:
Shtimi i rregullave të Destinacionit 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]
}
Shtoni një rregull NAT për përkthimin e portit në serverin SSH nën 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]
}
Shtoni një rregull NAT për përkthimin e portit në serverin SSH me 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]
}
Shtoni një rregull NAT për përkthimin e portit në serverin SSH me 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]
}
Konfigurimi i mjedisit virtual Main.tf
Siç kemi planifikuar në fillim të artikullit, ne do të krijojmë tre makina virtuale. Ato do të përgatiten duke përdorur "Përshtatja e mysafirëve". Ne do të vendosim parametrat e rrjetit sipas cilësimeve që kemi specifikuar dhe fjalëkalimi i përdoruesit do të gjenerohet automatikisht.
Le të përshkruajmë vApp-in në të cilin do të vendosen makinat virtuale dhe konfigurimin e tyre.
Konfigurimi i makinës virtuale
Le të krijojmë një kontejner vApp. Që të mund të lidhim menjëherë vApp dhe VM me rrjetin virtual, shtojmë edhe parametrin varet_on:
Krijo një enë
resource "vcd_vapp" "vapp" {
name = "web"
power_on = "true"
depends_on = [vcd_network_routed.net]
}
Le të krijojmë një makinë virtuale me një përshkrim
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
}
}
Parametrat kryesorë në përshkrimin e VM:
-
emri - emri i makinës virtuale,
-
vappname - emri i vApp në të cilin mund të shtohet një VM e re,
-
emri i katalogut / emri i shabllonit - emri i katalogut dhe emri i shabllonit të makinës virtuale,
-
Storageprofile - politika e paracaktuar e ruajtjes.
Parametrat e bllokut të rrjetit:
-
lloji - lloji i rrjetit të lidhur,
-
emri — me cilin rrjet virtual të lidhni VM-në,
-
është primar - përshtatës primar i rrjetit,
-
ipallocation_mode — MANUAL / DHCP / Modaliteti i shpërndarjes së adresës POOL,
-
ip - Adresa IP për makinën virtuale, ne do ta specifikojmë atë me dorë.
bllokimi i override_template_disk:
-
sizeinmb — madhësia e diskut të nisjes për makinën virtuale
-
Storage_profile — politika e ruajtjes për diskun
Le të krijojmë një VM të dytë me një përshkrim të ruajtjes së skedarëve 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 ]
}
Në seksionin vcdvminternal_disk do të përshkruajmë një disk të ri virtual që është i lidhur me makinën virtuale.
Shpjegime për bllokun vcdvminternaldisk:
-
bustype - lloji i kontrolluesit të diskut
-
sizeinmb - madhësia e diskut
-
busnumber / unitnumber - vendndodhja e lidhjes në përshtatës
-
Storage_profile — politika e ruajtjes për diskun
Le të përshkruajmë VM-në më të fundit në 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
}
}
Përditësimi i sistemit operativ dhe instalimi i skripteve shtesë
Është përgatitur rrjeti, janë përshkruar makinat virtuale. Përpara se të importojmë infrastrukturën tonë, ne mund të kryejmë sigurimin fillestar paraprakisht duke përdorur blloqet e ofruesve dhe pa përdorur Ansible.
Le të shohim se si të përditësojmë OS dhe të ekzekutojmë skriptin e instalimit CMS Bitrix duke përdorur bllokun e ofruesit.
Së pari, le të instalojmë paketat e përditësimit të 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" ]
}
}
}
Përcaktimi i komponentëve:
-
ofruesi "remote-exec" - lidhni bllokun e furnizimit në distancë
-
Në bllokun e lidhjes ne përshkruajmë llojin dhe parametrat për lidhjen:
-
lloji — protokoll, në rastin tonë SSH;
-
përdorues - emri i përdoruesit;
-
fjalëkalimi - fjalëkalimi i përdoruesit. Në rastin tonë, ne tregojmë te parametri vcdvappvm.nginx.customization[0].admin_password, i cili ruan fjalëkalimin e krijuar për përdoruesin e sistemit.
-
host - adresa IP e jashtme për lidhje;
-
port - porta për lidhje, e cila ishte specifikuar më parë në cilësimet e DNAT;
-
inline - listoni listën e komandave që do të futen. Komandat do të futen sipas radhës siç tregohet në këtë seksion.
Si shembull, le të ekzekutojmë gjithashtu skriptin e instalimit 1C-Bitrix. Prodhimi i rezultatit të ekzekutimit të skriptit do të jetë i disponueshëm gjatë ekzekutimit të planit. Për të instaluar skriptin, së pari ne përshkruajmë bllokun:
Le të përshkruajmë instalimin e 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"
]
}
Dhe ne do të përshkruajmë menjëherë përditësimin Bitrix.
Një shembull i ofrimit të 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"
]
}
}
E rëndësishme! Skripti mund të mos funksionojë nëse nuk e çaktivizoni SELinux paraprakisht! Nëse keni nevojë për një artikull të detajuar mbi instalimin dhe konfigurimin e CMS 1C-Bitrix duke përdorur bitrix-env.sh, oo mundeni
3. Inicializimi i infrastrukturës
Inicializimi i moduleve dhe shtojcave
Për punë, ne përdorim një "komplet të zotërinjve" të thjeshtë: një laptop me Windows 10 OS dhe një çantë shpërndarjeje nga faqja zyrtare e internetit terraform.exe init
Pas përshkrimit të infrastrukturës kompjuterike dhe të rrjetit, ne nisim planifikimin për të testuar konfigurimin tonë, ku mund të shohim se çfarë do të krijohet dhe si do të lidhet me njëri-tjetrin.
-
Ekzekutoni komandën
- terraform plan -var-file=vcd.tfvars
. -
Ne marrim rezultatin
- Plan: 16 to add, 0 to change, 0 to destroy.
Domethënë sipas këtij plani do të krijohen 16 burime. -
Ne nisim planin me komandë
- terraform.exe apply -var-file=vcd.tfvars
.
Do të krijohen makina virtuale dhe më pas paketat që kemi renditur do të ekzekutohen brenda seksionit të ofruesit - OS do të përditësohet dhe do të instalohet CMS Bitrix.
Marrja e të dhënave të lidhjes
Pas ekzekutimit të planit, ne duam të marrim të dhëna në formë teksti për t'u lidhur me serverët; për këtë, ne do të formatojmë seksionin e daljes si më poshtë:
output "nginxpassword" {
value = vcdvappvm.nginx.customization[0].adminpassword
}
Dhe dalja e mëposhtme na tregon fjalëkalimin për makinën virtuale të krijuar:
Outputs: nginx_password = F#4u8!!N
Si rezultat, ne kemi akses në makinat virtuale me një sistem operativ të përditësuar dhe paketa të para-instaluara për punën tonë të mëtejshme. Gjithçka është gati!
Por, çka nëse tashmë keni infrastrukturë ekzistuese?
3.1. Terraform pune me infrastrukturen ekzistuese
Është e thjeshtë, ju mund të importoni makinat aktuale virtuale dhe kontejnerët e tyre vApp duke përdorur komandën e importit.
Le të përshkruajmë burimin vAPP dhe makinën virtuale.
resource "vcd_vapp" "Monitoring" {
name = "Monitoring"
org = "mClouds"
vdc = "mClouds"
}
resource "vcd_vapp_vm" "Zabbix" {
name = "Zabbix"
org = "mClouds"
vdc = "mClouds"
vapp = "Monitoring"
}
Hapi tjetër është të importoni vetitë e burimeve të vApp në format vcdvapp.<vApp> <org>.<orgvdc>.<vApp>
, ku:
-
vApp - emri i aplikacionit;
-
org - emri i organizatës;
-
org_vdc - emri i qendrës virtuale të të dhënave.
Importimi i vetive të burimit vAPP
Le të importojmë vetitë e burimeve VM në formatin: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>
, në të cilën:
-
VM - emri VM;
-
vApp - emri i aplikacionit;
-
org - emri i organizatës;
-
orgvdc është emri i qendrës virtuale të të dhënave.
Importi ishte i suksesshëm
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.
Tani mund të shikojmë burimin e ri të importuar:
Burim i importuar
> 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"
}
}
Tani jemi patjetër gati - kemi përfunduar me pikën e fundit (importimi në infrastrukturën ekzistuese) dhe kemi marrë parasysh të gjitha pikat kryesore të punës me Terraform.
Mjeti doli të jetë shumë i përshtatshëm dhe ju lejon të përshkruani infrastrukturën tuaj si kod, duke filluar nga makinat virtuale të një ofruesi të reve deri te përshkrimi i burimeve të komponentëve të rrjetit.
Në të njëjtën kohë, pavarësia nga mjedisi bën të mundur punën me burimet lokale, cloud, madje edhe menaxhimin e platformës. Dhe nëse nuk ka asnjë platformë të mbështetur dhe dëshironi të shtoni një të re, mund të shkruani ofruesin tuaj dhe ta përdorni atë.
Burimi: www.habr.com