Ki jan yo jere enfrastrikti nwaj ak Terraform

Ki jan yo jere enfrastrikti nwaj ak Terraform

Nan atik sa a nou pral gade nan ki sa Terraform konsiste de, epi tou piti piti lanse pwòp enfrastrikti nou an nan nwaj la ak VMware — nou pral prepare twa VM pou diferan rezon: proxy, depo dosye ak CMS.

Sou tout bagay an detay ak nan twa etap:

1. Terraform - deskripsyon, avantaj ak konpozan

Terraform se yon zouti IaC (Infrastructure-as-Code) pou konstwi ak jere enfrastrikti vityèl lè l sèvi avèk kòd.

Nou te note plizyè avantaj nan travay ak zouti a:

  • Vitès deplwaman nouvo lokatè yo (anviwònman vityèl koutim). Tipikman, plis nouvo kliyan gen plis "klik" anplwaye sipò teknik yo bezwen fè pou pibliye nouvo resous yo. Avèk Terraform, itilizatè yo ka chanje anviwònman machin vityèl (pa egzanp, otomatikman fèmen OS la epi ogmante patisyon ki gen kapasite vityèl la) san yo pa bezwen sipò teknik oswa fèmen machin nan tèt li.

  • Verifikasyon enstantane nan plan deklanchman an nouvo Tennant. Sèvi ak deskripsyon kòd enfrastrikti a, nou ka imedyatman tcheke sa yo pral ajoute ak nan ki lòd, osi byen ke nan ki eta final sa a oswa sa a machin vityèl oswa rezo vityèl ki gen koneksyon ak machin vityèl yo pral.

  • Kapasite pou dekri platfòm nwaj ki pi popilè yo. Ou ka itilize zouti a soti nan Amazon ak Google Cloud, nan platfòm prive ki baze sou VMware vCloud Director, ki ofri sèvis nan solisyon IaaS, SaaS ak PaaS.

  • Jere plizyè founisè nwaj epi distribye enfrastrikti a ant yo pou amelyore tolerans fay, lè l sèvi avèk yon sèl konfigirasyon pou kreye, fè dyagnostik ak jere resous nwaj yo.

  • Itilizasyon pratik pou kreye stands Demo pou tès lojisyèl ak debogaj. Ou ka kreye epi transfere kanpe pou depatman tès la, teste lojisyèl nan diferan anviwònman an paralèl, epi imedyatman chanje ak efase resous lè w kreye yon sèl plan pou konstwi resous.

"Terrarium" Terraform

Nou te pale yon ti tan sou avantaj ki genyen nan zouti a, kounye a se pou yo kraze li nan eleman li yo

Founisè yo. 

Nan Terraform, prèske nenpòt kalite enfrastrikti ka reprezante kòm yon resous. Koneksyon ant resous ak platfòm API a bay modil founisè yo, ki pèmèt ou kreye resous nan yon platfòm espesifik, pou egzanp, Azure oswa VMware vCloud Director.

Kòm yon pati nan pwojè a, ou ka kominike avèk diferan founisè sou platfòm diferan.

Resous (deskripsyon resous).

Deskripsyon resous pèmèt ou jere konpozan platfòm, tankou machin vityèl oswa rezo. 

Ou ka kreye yon deskripsyon resous pou founisè VMware vCloud Director tèt ou epi sèvi ak deskripsyon sa a pou kreye resous ak nenpòt founisè hosting ki itilize vCloud Director. Ou sèlman bezwen chanje paramèt otantifikasyon yo ak paramèt koneksyon rezo a bay founisè hosting obligatwa a

Founisè yo.

Eleman sa a fè li posib pou fè operasyon pou enstalasyon inisyal la ak antretyen nan sistèm operasyon an apre yo fin kreye machin vityèl. Yon fwa ou te kreye yon resous machin vityèl, ou ka itilize pwovizyon pou konfigirasyon ak konekte atravè SSH, mete ajou sistèm operasyon an, epi telechaje epi kouri yon script. 

Varyab Antre ak Sòti.

Varyab antre - varyab antre pou nenpòt ki kalite blòk. 

Varyab pwodiksyon pèmèt ou sove valè apre ou fin kreye resous epi yo ka itilize kòm varyab antre nan lòt modil, pou egzanp nan blòk Pwovizyonè yo.

Etazini.

Fichye Etazini yo estoke enfòmasyon sou konfigirasyon resous platfòm founisè yo. Lè platfòm la kreye premye, pa gen okenn enfòmasyon sou resous ak anvan nenpòt operasyon, Terraform mete ajou eta a ak enfrastrikti reyèl resous yo deja dekri.

Objektif prensipal eta yo se pou konsève pou yon pakèt bagay nan resous deja kreye yo konpare konfigirasyon an nan resous te ajoute ak objè yo nan lòd pou fè pou evite repete kreyasyon ak chanjman nan platfòm la.

Pa default, enfòmasyon eta yo estoke nan fichye terraform.tfstate lokal la, men si sa nesesè, li posib pou itilize depo aleka pou travay ekip.

Ou kapab tou enpòte resous platfòm aktyèl yo nan eta a plis kominike avèk lòt resous ki te nan vire kreye san èd nan Terraform.  

2. Kreyasyon enfrastrikti

Konpozan yo te klase soti, kounye a lè l sèvi avèk Terraform nou pral piti piti kreye yon enfrastrikti ak twa machin vityèl. Premye a ak sèvè proxy nginx enstale, dezyèm lan ak depo dosye ki baze sou Nextcloud ak twazyèm lan ak CMS Bitrix.

Nou pral ekri kòd epi egzekite li lè l sèvi avèk egzanp nou an nwaj sou VMware vCloud Direktè. Itilizatè nou yo resevwa yon kont ki gen dwa Administratè Òganizasyon Si w itilize yon kont ki gen menm dwa nan yon lòt nwaj VMware, ou ka repwodui kòd la nan egzanp nou yo. Ale!

Premyèman, ann kreye yon anyè pou nouvo pwojè nou an kote yo pral mete dosye ki dekri enfrastrikti a.

mkdir project01

Apre sa, nou dekri eleman enfrastrikti yo. Terraform kreye relasyon ak trete dosye ki baze sou deskripsyon ki nan dosye yo. Fichye yo tèt yo ka nonmen baze sou objektif blòk yo dekri, pou egzanp, network.tf - dekri paramèt rezo a pou enfrastrikti a.

Pou dekri eleman enfrastrikti nou an, nou te kreye dosye sa yo:

Lis fichye yo.

main.tf - deskripsyon paramèt pou anviwònman an vityèl - machin vityèl, resipyan vityèl;

network.tf - deskripsyon paramèt rezo vityèl ak règ NAT ak Firewall;

variables.tf - lis varyab ke nou itilize;

vcd.tfvars - valè varyab pwojè pou modil VMware vCloud Director.

Lang konfigirasyon nan Terraform se deklaratif ak lòd blòk yo pa gen pwoblèm, eksepte pou blòk pwovizyon yo, paske nan blòk sa a nou dekri kòmandman yo dwe egzekite lè w ap prepare enfrastrikti a epi yo pral egzekite nan lòd.

Estrikti blòk.

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

# Block body

<IDENTIFIER> = <EXPRESSION> # Argument

}

Pou dekri blòk yo, yo itilize pwòp langaj pwogramasyon HCL (HashiCorp Configuration Language) ; li posib pou dekri enfrastrikti a lè l sèvi avèk JSON. Ou ka aprann plis sou sentaks la li sou sit entènèt pwomotè a.

Konfigirasyon varyab anviwònman an, variables.tf ak vcd.tfvars

Premyèman, ann kreye de fichye ki dekri lis tout varyab yo itilize ak valè yo pou modil VMware vCloud Director. Premyèman, ann kreye fichye variables.tf.

Sa ki nan fichye 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" {}

Valè varyab ke nou resevwa nan men founisè a.

  • vcd_org_user — non itilizatè ki gen dwa Administratè Òganizasyon,

  • vcd_org_password — modpas itilizatè,

  • vcd_org - non òganizasyon an,

  • vcd_org_vdc — non sant done vityèl la,

  • vcd_org_url - API URL,

  • vcd_org_edge_name - non routeur vityèl la,

  • vcd_org_catalog — non anyè a ak modèl machin vityèl,

  • vcd_edge_external_ip — adrès IP piblik,

  • vcd_edge_external_network — non rezo ekstèn lan,

  • vcd_org_hdd_sp — non politik depo HDD a,

  • vcd_org_ssd_sp — non politik depo SSD la.

Epi antre varyab nou yo:

  • vcd_edge_local_ip_nginx — adrès IP machin vityèl la ak NGINX,

  • vcd_edge_local_ip_bitrix - adrès IP machin vityèl la ak 1C: Bitrix,

  • vcd_edge_local_ip_nextcloud — adrès IP machin vityèl la ak Nextcloud.

Avèk dezyèm fichye a nou kreye epi presize varyab pou modil la VMware vCloud Director nan fichye vcd.tfvars la: Ann sonje ke nan egzanp nou an nou itilize pwòp nwaj mClouds, si w ap travay ak yon lòt founisè, tcheke valè yo avèk yo. 

Sa ki nan fichye 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"

Rezo konfigirasyon, network.tf.

Varyab anviwònman yo mete, kounye a nou pral mete konplo koneksyon machin vityèl - nou pral bay yon adrès IP prive nan chak machin vityèl epi sèvi ak Destination NAT pou "voye" pò yo nan rezo ekstèn lan. Pou limite aksè nan pò jesyon, nou pral mete aksè sèlman pou adrès IP nou an.

Ki jan yo jere enfrastrikti nwaj ak TerraformDyagram rezo pou platfòm Terraform ap kreye

Nou kreye yon rezo òganizasyonèl vityèl ak non net_lan01, pòtay default la: 192.168.110.254, epi tou ak espas adrès la: 192.168.110.0/24.

Nou dekri yon rezo vityèl.

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"

  }

}

Ann kreye règ firewall ki pèmèt machin vityèl jwenn aksè nan entènèt la. Nan blòk sa a, tout resous vityèl nan nwaj la pral gen aksè a Entènèt:

Nou dekri règ yo pou aksè VM sou entènèt la.

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]

}

Èske w gen etabli depandans la ke apre trete blòk la vcdnetworkrouted.net, nou kontinye nan konfigirasyon blòk la vcdnsxvfirewallrule., lè l sèvi avèk depann. Nou itilize opsyon sa a paske kèk depandans yo ka rekonèt implicite nan konfigirasyon an.

Apre sa, nou pral kreye règ ki pèmèt aksè nan pò soti nan rezo a ekstèn epi endike adrès IP nou an pou konekte via SSH nan sèvè yo. Nenpòt itilizatè entènèt gen aksè a pò 80 ak 443 sou sèvè entènèt la, epi yon itilizatè ki gen yon adrès IP 90.1.15.1 gen aksè a pò SSH nan sèvè vityèl yo.

Pèmèt aksè nan pò soti nan rezo ekstèn lan.

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]

}

Nou kreye règleman Source NAT pou jwenn aksè nan entènèt la nan yon rezo lokal nwaj:

Nou dekri règ Sous NAT yo.

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]

}

Epi pou konplete konfigirasyon blòk rezo a, nou ajoute règ Destination NAT pou jwenn aksè nan sèvis ki soti nan rezo ekstèn lan:

Ajoute règ NAT destinasyon yo.

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]

}

Ajoute yon règ NAT pou tradiksyon pò sou sèvè SSH la anba 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]

}

Ajoute yon règ NAT pou tradiksyon pò sou sèvè SSH la ak 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]

}

Ajoute yon règ NAT pou tradiksyon pò sou sèvè SSH la ak 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 konfigirasyon anviwònman vityèl

Kòm nou te planifye nan kòmansman atik la, nou pral kreye twa machin vityèl. Yo pral prepare lè l sèvi avèk "Personalizasyon envite". Nou pral mete paramèt rezo yo dapre paramèt nou espesifye yo, epi modpas itilizatè a pral pwodwi otomatikman.

Ann dekri vApp kote machin vityèl yo pral lokalize ak konfigirasyon yo.

Ki jan yo jere enfrastrikti nwaj ak TerraformKonfigirasyon machin vityèl

Ann kreye yon veso vApp. Pou nou ka imedyatman konekte vApp ak VM nan rezo vityèl la, nou ajoute tou paramèt depends_on:

Kreye yon veso

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

}

Ann kreye yon machin vityèl ak yon deskripsyon

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

}

}

Paramèt prensipal nan deskripsyon VM:

  • non - non machin vityèl la,

  • vappname - non vApp a pou ajoute yon nouvo VM,

  • cataloguename / templatename - non katalòg ak non modèl machin vityèl,

  • storageprofile - règleman depo default.

Paramèt blòk rezo:

  • kalite - kalite rezo konekte,

  • non - ki rezo vityèl pou konekte VM a,

  • isprimary - adaptè rezo prensipal,

  • ipallocation_mode — Mòd alokasyon adrès MANYÈL / DHCP / POOL,

  • ip — adrès IP pou machin vityèl la, nou pral presize li manyèlman.

override_template_disk blòk:

  • sizeinmb — gwosè disk bòt pou machin vityèl la

  • storage_profile — politik depo pou disk la

Ann kreye yon dezyèm VM ak yon deskripsyon depo dosye Nextcloud la

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 ]

}

Nan seksyon vcdvminternal_disk nou pral dekri yon nouvo disk vityèl ki konekte ak machin vityèl la.

Eksplikasyon pou blòk vcdvmininternaldisk la:

  • bustype - kalite kontwolè disk

  • sizeinmb — gwosè disk

  • busnumber / unitnumber - kote koneksyon nan adaptè a

  • storage_profile — politik depo pou disk la

Ann dekri dènye VM sou 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

}

}

Mete ajou eksplwatasyon an ak enstale scripts adisyonèl

Rezo a prepare, machin vityèl yo dekri. Anvan enpòte enfrastrikti nou an, nou ka fè premye pwovizyon davans lè l sèvi avèk blòk pwovizyon epi san nou pa itilize Ansible.

Ann gade ki jan yo mete ajou OS la epi kouri script enstalasyon CMS Bitrix lè l sèvi avèk blòk pwovizyon an.

Premyèman, ann enstale pakè aktyalizasyon 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" ]

}

}

}

Deziyasyon eleman yo:

  • pwovizyon "remote-exec" - konekte blòk pwovizyon aleka

  • Nan blòk koneksyon an nou dekri kalite a ak paramèt pou koneksyon an:

  • tip - pwotokòl, nan ka nou an SSH;

  • itilizatè — non itilizatè;

  • modpas - modpas itilizatè. Nan ka nou an, nou lonje dwèt sou paramèt vcdvappvm.nginx.customization[0].admin_password, ki estoke modpas ki pwodui pou itilizatè sistèm lan.

  • host - ekstèn adrès IP pou koneksyon;

  • pò — pò pou koneksyon, ki te deja espesifye nan anviwònman DNAT yo;

  • inline - lis lis kòmandman yo pral antre. Kòmandman yo pral antre nan lòd jan sa endike nan seksyon sa a.

Kòm yon egzanp, ann anplis egzekite script enstalasyon 1C-Bitrix la. Pwodiksyon rezilta ekzekisyon script la ap disponib pandan plan an ap kouri. Pou enstale script la, premye nou dekri blòk la:

Ann dekri enstalasyon 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"

]

}

Epi nou pral imedyatman dekri aktyalizasyon Bitrix la.

Yon egzanp pwovizyon 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"

]

}

}

Enpòtan! Script la ka pa travay si ou pa enfim SELinux davans! Si ou bezwen yon atik detaye sou enstale ak konfigirasyon CMS 1C-Bitrix lè l sèvi avèk bitrix-env.sh, oo ou kapab sèvi ak atik blog nou an sou sit entènèt la.

3. Inisyalizasyon enfrastrikti

Ki jan yo jere enfrastrikti nwaj ak TerraformInisyalize modil ak grefon

Pou travay, nou itilize yon senp "twos mesye": yon laptop ak Windows 10 OS ak yon twous distribisyon ki soti nan sit entènèt ofisyèl la. terraform.io. Ann depake ak inisyalize lè l sèvi avèk kòmandman an: terraform.exe init

Apre nou fin dekri enfrastrikti enfòmatik ak rezo a, nou lanse planifikasyon pou teste konfigirasyon nou an, kote nou ka wè sa ki pral kreye ak kijan li pral konekte youn ak lòt.

  1. Egzekite kòmandman an - terraform plan -var-file=vcd.tfvars.

  2. Nou jwenn rezilta a - Plan: 16 to add, 0 to change, 0 to destroy. Sa vle di, dapre plan sa a, 16 resous yo pral kreye.

  3. Nou lanse plan an sou lòd - terraform.exe apply -var-file=vcd.tfvars.

Yo pral kreye machin vityèl, epi apre pakè nou te site yo pral egzekite nan seksyon pwovizyon - OS la pral mete ajou epi CMS Bitrix pral enstale.

Resevwa enfòmasyon sou koneksyon

Apre egzekite plan an, nou vle resevwa done nan fòm tèks pou konekte ak sèvè yo, pou sa nou pral fòma seksyon pwodiksyon an jan sa a:

output "nginxpassword" {

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

}

Ak pwodiksyon sa a di nou modpas la pou machin vityèl kreye a:

Outputs: nginx_password = F#4u8!!N

Kòm yon rezilta, nou jwenn aksè nan machin vityèl ak yon sistèm opere aktyalize ak pakè pre-enstale pou plis travay nou an. Tout pare!

Men, e si ou deja genyen enfrastrikti ki egziste deja?

3.1. Travay Terraform ak enfrastrikti ki egziste deja

Li senp, ou ka enpòte machin vityèl aktyèl yo ak kontenè vApp yo lè l sèvi avèk lòd enpòte a.

Ann dekri resous vAPP ak machin vityèl la.

resource "vcd_vapp" "Monitoring" {

name = "Monitoring"

org = "mClouds"

vdc = "mClouds"

}

resource "vcd_vapp_vm" "Zabbix" {

name = "Zabbix"

org = "mClouds"

vdc = "mClouds"

vapp = "Monitoring"

}

Pwochen etap la se enpòte pwopriyete resous vApp nan fòma a vcdvapp.<vApp> <org>.<orgvdc>.<vApp>, kote:

  • vApp - non vApp;

  • org — non òganizasyon an;

  • org_vdc — non sant done vityèl la.

Ki jan yo jere enfrastrikti nwaj ak TerraformEnpòte pwopriyete resous vAPP

Ann enpòte pwopriyete resous VM yo nan fòma a: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>, nan ki:

  • VM - Non VM;

  • vApp - non vApp;

  • org — non òganizasyon an;

  • orgvdc se non sant done vityèl la.

Enpòte te gen siksè

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.

Koulye a, nou ka gade nan nouvo resous enpòte:

Resous enpòte

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

}

}

Koulye a, nou definitivman pare - nou fini ak dènye pwen an (enpòte nan enfrastrikti ki egziste deja) epi yo te konsidere tout pwen prensipal yo nan travay ak Terraform. 

Zouti a te tounen trè pratik epi li pèmèt ou dekri enfrastrikti ou kòm kòd, kòmanse nan machin vityèl nan yon founisè nwaj pou dekri resous eleman rezo yo.

An menm tan, endepandans nan anviwònman an fè li posib pou travay ak resous lokal yo, nwaj, e menm jere platfòm la. Men, si pa gen okenn platfòm sipòte epi ou vle ajoute yon nouvo, ou ka ekri founisè pwòp ou a epi sèvi ak li.

Sous: www.habr.com

Add nouvo kòmantè