Paano Pamahalaan ang Cloud Infrastructure gamit ang Terraform

Paano Pamahalaan ang Cloud Infrastructure gamit ang Terraform

Sa artikulong ito titingnan natin kung ano ang binubuo ng Terraform, at unti-unti ring ilulunsad ang sarili nating imprastraktura sa cloud kasama ang VMware — maghahanda kami ng tatlong VM para sa iba't ibang layunin: proxy, file storage at CMS.

Tungkol sa lahat nang detalyado at sa tatlong yugto:

1. Terraform - paglalarawan, mga pakinabang at mga bahagi

Ang Terraform ay isang IaC (Infrastructure-as-Code) na tool para sa pagbuo at pamamahala ng virtual na imprastraktura gamit ang code.

Napansin namin ang ilang mga pakinabang sa pagtatrabaho sa tool:

  • Bilis ng deployment ng mga bagong nangungupahan (mga pasadyang virtual na kapaligiran). Karaniwan, kapag mas maraming bagong kliyente, mas maraming "pag-click" ang kailangang gawin ng kawani ng teknikal na suporta upang mag-publish ng mga bagong mapagkukunan. Sa Terraform, maaaring baguhin ng mga user ang mga setting ng virtual machine (halimbawa, awtomatikong i-shut down ang OS at dagdagan ang virtual disk partition) nang hindi nangangailangan ng teknikal na suporta o shut down ang machine mismo.

  • Instant na pag-verify ng activation plan bagong Nangungupahan. Gamit ang paglalarawan ng code ng imprastraktura, maaari naming agad na suriin kung ano ang idaragdag at sa anong pagkakasunud-sunod, pati na rin sa kung anong huling estado ito o ang virtual machine o virtual network na iyon na may mga koneksyon sa mga virtual machine.

  • Kakayahang ilarawan ang pinakasikat na cloud platform. Maaari mong gamitin ang tool mula sa Amazon at Google Cloud, hanggang sa mga pribadong platform batay sa VMware vCloud Director, na nag-aalok ng mga serbisyo sa loob ng IaaS, SaaS at PaaS na mga solusyon.

  • Pamahalaan ang maraming cloud provider at ipamahagi ang imprastraktura sa pagitan nila para mapahusay ang fault tolerance, gamit ang isang configuration para gumawa, mag-diagnose at mamahala ng cloud resources.

  • Maginhawang paggamit para sa paglikha ng mga demo stand para sa pagsubok ng software at pag-debug. Maaari kang gumawa at maglipat ng mga stand para sa testing department, pagsubok ng software sa iba't ibang kapaligiran nang magkatulad, at agad na baguhin at tanggalin ang mga mapagkukunan sa pamamagitan ng paglikha ng isang resource build plan lang.

"Terrarium" Terraform

Sa madaling sabi, napag-usapan namin ang tungkol sa mga pakinabang ng tool, ngayon ay hatiin natin ito sa mga bahagi nito

Mga provider. 

Sa Terraform, halos anumang uri ng imprastraktura ay maaaring katawanin bilang isang mapagkukunan. Ang koneksyon sa pagitan ng mga mapagkukunan at platform ng API ay ibinibigay ng mga module ng provider, na nagbibigay-daan sa iyong lumikha ng mga mapagkukunan sa loob ng isang partikular na platform, halimbawa, Azure o VMware vCloud Director.

Bilang bahagi ng proyekto, maaari kang makipag-ugnayan sa iba't ibang provider sa iba't ibang platform.

Mga mapagkukunan (paglalarawan ng mapagkukunan).

Nagbibigay-daan sa iyo ang paglalarawan ng mga mapagkukunan na pamahalaan ang mga bahagi ng platform, gaya ng mga virtual machine o network. 

Maaari kang lumikha ng isang paglalarawan ng mapagkukunan para sa provider ng VMware vCloud Director mismo at gamitin ang paglalarawang ito upang lumikha ng mga mapagkukunan sa anumang provider ng hosting na gumagamit ng vCloud Director. Kailangan mo lang baguhin ang mga parameter ng pagpapatunay at mga parameter ng koneksyon sa network sa kinakailangang hosting provider

Mga tagapagbigay.

Ginagawang posible ng bahaging ito na magsagawa ng mga operasyon para sa paunang pag-install at pagpapanatili ng operating system pagkatapos lumikha ng mga virtual machine. Kapag nakagawa ka na ng virtual machine resource, maaari mong gamitin ang mga provisioner para i-configure at kumonekta sa pamamagitan ng SSH, i-update ang operating system, at mag-download at magpatakbo ng script. 

Mga variable ng Input at Output.

Input variable - input variable para sa anumang uri ng block. 

Binibigyang-daan ka ng mga variable ng output na mag-save ng mga halaga pagkatapos lumikha ng mga mapagkukunan at maaaring magamit bilang mga variable ng input sa iba pang mga module, halimbawa sa block ng Provisioners.

Estado.

Ang mga state file ay nag-iimbak ng impormasyon tungkol sa pagsasaayos ng mga mapagkukunan ng platform ng provider. Noong unang ginawa ang platform, walang impormasyon tungkol sa mga mapagkukunan at bago ang anumang operasyon, ina-update ng Terraform ang estado sa totoong imprastraktura ng mga mapagkukunang inilarawan na.

Ang pangunahing layunin ng mga estado ay upang i-save ang isang bungkos ng mga bagay ng nalikha na mga mapagkukunan upang ihambing ang pagsasaayos ng mga idinagdag na mapagkukunan at mga bagay upang maiwasan ang paulit-ulit na paglikha at mga pagbabago sa platform.

Bilang default, nakaimbak ang impormasyon ng estado sa lokal na terraform.tfstate file, ngunit kung kinakailangan, posibleng gumamit ng malayuang imbakan para sa pangkatang gawain.

Maaari ka ring mag-import ng kasalukuyang mga mapagkukunan ng platform sa estado upang higit pang makipag-ugnayan sa iba pang mga mapagkukunan na nilikha naman nang walang tulong ng Terraform.  

2. Paglikha ng imprastraktura

Naayos na ang mga bahagi, ngayon gamit ang Terraform ay unti-unti tayong lilikha ng isang imprastraktura na may tatlong virtual machine. Ang una ay may naka-install na nginx proxy server, ang pangalawa ay may imbakan ng file batay sa Nextcloud at ang pangatlo ay may CMS Bitrix.

Isusulat namin ang code at isasagawa ito gamit ang aming halimbawa ulap sa VMware vCloud Director. Nakatanggap ang aming mga user ng account na may mga karapatan sa Administrator ng Organisasyon. Kung gumagamit ka ng account na may parehong mga karapatan sa isa pang VMware cloud, maaari mong kopyahin ang code mula sa aming mga halimbawa. Go!

Una, gumawa tayo ng direktoryo para sa ating bagong proyekto kung saan ilalagay ang mga file na naglalarawan sa imprastraktura.

mkdir project01

Susunod, inilalarawan namin ang mga bahagi ng imprastraktura. Gumagawa ang Terraform ng mga relasyon at nagpoproseso ng mga file batay sa paglalarawan sa mga file. Ang mga file mismo ay maaaring pangalanan batay sa layunin ng mga bloke na inilalarawan, halimbawa, network.tf - inilalarawan ang mga parameter ng network para sa imprastraktura.

Upang ilarawan ang mga bahagi ng aming imprastraktura, ginawa namin ang mga sumusunod na file:

Listahan ng mga file.

main.tf - paglalarawan ng mga parameter para sa virtual na kapaligiran - mga virtual machine, mga virtual na lalagyan;

network.tf - paglalarawan ng mga parameter ng virtual network at mga panuntunan ng NAT at Firewall;

variables.tf - listahan ng mga variable na ginagamit namin;

vcd.tfvars - mga variable na value ng proyekto para sa module ng VMware vCloud Director.

Ang wika ng pagsasaayos sa Terraform ay deklaratibo at ang pagkakasunud-sunod ng mga bloke ay hindi mahalaga, maliban sa mga bloke ng tagapagbigay, dahil sa block na ito inilalarawan namin ang mga utos na isasagawa kapag inihahanda ang imprastraktura at isasagawa ang mga ito sa pagkakasunud-sunod.

Istruktura ng block.

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

# Block body

<IDENTIFIER> = <EXPRESSION> # Argument

}

Upang ilarawan ang mga bloke, ang sarili nitong programming language na HCL (HashiCorp Configuration Language) ay ginagamit; posibleng ilarawan ang imprastraktura gamit ang JSON. Maaari kang matuto nang higit pa tungkol sa syntax basahin sa website ng developer.

Configuration ng variable ng kapaligiran, variables.tf at vcd.tfvars

Una, gumawa tayo ng dalawang file na naglalarawan sa listahan ng lahat ng ginamit na variable at ang kanilang mga halaga para sa module ng VMware vCloud Director. Una, gawin natin ang variables.tf file.

Mga nilalaman ng variables.tf file.

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

Mga variable na halaga na natatanggap namin mula sa provider.

  • vcd_org_user — username na may mga karapatan sa Administrator ng Organisasyon,

  • vcd_org_password — password ng gumagamit,

  • vcd_org — pangalan ng organisasyon,

  • vcd_org_vdc — pangalan ng virtual data center,

  • vcd_org_url - API URL,

  • vcd_org_edge_name — pangalan ng virtual router,

  • vcd_org_catalog — pangalan ng direktoryo na may mga template ng virtual machine,

  • vcd_edge_external_ip — pampublikong IP address,

  • vcd_edge_external_network — pangalan ng panlabas na network,

  • vcd_org_hdd_sp — pangalan ng patakaran sa imbakan ng HDD,

  • vcd_org_ssd_sp — pangalan ng patakaran sa storage ng SSD.

At ipasok ang aming mga variable:

  • vcd_edge_local_ip_nginx — IP address ng virtual machine na may NGINX,

  • vcd_edge_local_ip_bitrix - IP address ng virtual machine na may 1C: Bitrix,

  • vcd_edge_local_ip_nextcloud — IP address ng virtual machine na may Nextcloud.

Gamit ang pangalawang file na ginagawa namin at tinukoy ang mga variable para sa module ng VMware vCloud Director sa vcd.tfvars file: Alalahanin natin na sa ating halimbawa ay ginagamit natin sariling cloud mClouds, kung nagtatrabaho ka sa ibang provider, suriin ang mga halaga sa kanila. 

Mga nilalaman ng vcd.tfvars file.

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 configuration, network.tf.

Nakatakda ang mga variable ng kapaligiran, ngayon ay ise-set up namin ang scheme ng koneksyon ng virtual machine - magtatalaga kami ng pribadong IP address sa bawat virtual machine at gagamitin ang Destination NAT para "ipasa" ang mga port sa external na network. Upang limitahan ang pag-access sa mga port ng pamamahala, magtatakda kami ng access para lamang sa aming IP address.

Paano Pamahalaan ang Cloud Infrastructure gamit ang TerraformNetwork diagram para sa platform ng Terraform na ginagawa

Gumagawa kami ng virtual na network ng organisasyon na may pangalang net_lan01, ang default na gateway: 192.168.110.254, at pati na rin ang address space: 192.168.110.0/24.

Inilalarawan namin ang isang virtual network.

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"

  }

}

Gumawa tayo ng mga panuntunan sa firewall na nagpapahintulot sa mga virtual machine na ma-access ang Internet. Sa loob ng block na ito, lahat ng virtual na mapagkukunan sa cloud ay magkakaroon ng access sa Internet:

Inilalarawan namin ang mga patakaran para sa pag-access ng VM sa 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]

}

Ang pagkakaroon ng itinatag na dependency na pagkatapos ng pagproseso ng vcdnetworkrouted.net block, nagpapatuloy kami upang i-configure ang vcdnsxvfirewallrule block, sa pamamagitan ng paggamit depende sa. Ginagamit namin ang pagpipiliang ito dahil ang ilang mga dependency ay maaaring makilala nang tahasan sa pagsasaayos.

Susunod, gagawa kami ng mga panuntunan na nagbibigay-daan sa pag-access sa mga port mula sa panlabas na network at ipahiwatig ang aming IP address para sa pagkonekta sa pamamagitan ng SSH sa mga server. Ang sinumang user ng Internet ay may access sa mga port 80 at 443 sa web server, at ang isang user na may IP address na 90.1.15.1 ay may access sa mga SSH port ng virtual server.

Payagan ang pag-access sa mga port mula sa panlabas na network.

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]

}

Lumilikha kami ng mga panuntunan ng Source NAT para sa pag-access sa Internet mula sa isang cloud local network:

Inilalarawan namin ang mga panuntunan ng 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]

}

At para makumpleto ang pagsasaayos ng network block, nagdagdag kami ng mga panuntunan sa Destination NAT para sa pag-access ng mga serbisyo mula sa panlabas na network:

Pagdaragdag ng mga panuntunan sa 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"

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]

}

Magdagdag ng panuntunan ng NAT para sa pagsasalin ng port sa SSH server sa ilalim ng 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]

}

Magdagdag ng panuntunan ng NAT para sa pagsasalin ng port sa SSH server na may 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]

}

Magdagdag ng panuntunan ng NAT para sa pagsasalin ng port sa SSH server na may 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 virtual na pagsasaayos ng kapaligiran

Tulad ng aming pinlano sa simula ng artikulo, lilikha kami ng tatlong virtual machine. Ihahanda sila gamit ang "Guest Customization". Itatakda namin ang mga parameter ng network ayon sa mga setting na tinukoy namin, at awtomatikong bubuo ang password ng user.

Ilarawan natin ang vApp kung saan matatagpuan ang mga virtual machine at ang kanilang configuration.

Paano Pamahalaan ang Cloud Infrastructure gamit ang TerraformPagsasaayos ng virtual machine

Gumawa tayo ng container ng vApp. Upang agad naming maikonekta ang vApp at VM sa virtual network, idinaragdag din namin ang depende_on parameter:

Gumawa ng lalagyan

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

}

Gumawa tayo ng virtual machine na may paglalarawan

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

}

}

Mga pangunahing parameter sa paglalarawan ng VM:

  • pangalan — pangalan ng virtual machine,

  • vappname - pangalan ng vApp kung saan magdagdag ng bagong VM,

  • catalogname / templatename - pangalan ng catalog at pangalan ng template ng virtual machine,

  • storageprofile - default na patakaran sa storage.

Mga parameter ng block ng network:

  • uri — uri ng konektadong network,

  • pangalan — kung saang virtual network ikokonekta ang VM,

  • isprimary - pangunahing network adapter,

  • ipallocation_mode — MANUAL / DHCP / POOL address allocation mode,

  • ip — IP address para sa virtual machine, tutukuyin namin ito nang manu-mano.

override_template_disk block:

  • sizeinmb — laki ng boot disk para sa virtual machine

  • storage_profile — patakaran sa imbakan para sa disk

Gumawa tayo ng pangalawang VM na may paglalarawan ng Nextcloud file storage

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 ]

}

Sa seksyong vcdvminternal_disk ilalarawan namin ang isang bagong virtual disk na konektado sa virtual machine.

Mga paliwanag para sa vcdvminternaldisk block:

  • bustype - uri ng disk controller

  • sizeinmb - laki ng disk

  • busnumber / unitnumber - lokasyon ng koneksyon sa adaptor

  • storage_profile — patakaran sa imbakan para sa disk

Ilarawan natin ang pinakabagong VM sa 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

}

}

Pag-update ng OS at pag-install ng mga karagdagang script

Inihanda ang network, inilarawan ang mga virtual machine. Bago i-import ang aming imprastraktura, maaari naming isagawa ang paunang provisioning nang maaga gamit ang mga provisioner block at nang hindi gumagamit ng Ansible.

Tingnan natin kung paano i-update ang OS at patakbuhin ang script ng pag-install ng CMS Bitrix gamit ang provisioner block.

Una, i-install natin ang mga pakete ng pag-update ng 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" ]

}

}

}

Pagtatalaga ng mga bahagi:

  • provisioner "remote-exec" - ikonekta ang remote provisioning block

  • Sa bloke ng koneksyon inilalarawan namin ang uri at mga parameter para sa koneksyon:

  • uri - protocol, sa aming kaso SSH;

  • user — user name;

  • password — password ng gumagamit. Sa aming kaso, itinuturo namin ang parameter na vcdvappvm.nginx.customization[0].admin_password, na nag-iimbak ng nabuong password para sa user ng system.

  • host - panlabas na IP address para sa koneksyon;

  • port — port para sa koneksyon, na dati nang tinukoy sa mga setting ng DNAT;

  • inline - ilista ang listahan ng mga command na ipapasok. Ang mga utos ay ipapasok sa pagkakasunud-sunod tulad ng ipinahiwatig sa seksyong ito.

Bilang halimbawa, isagawa din natin ang script ng pag-install ng 1C-Bitrix. Ang output ng resulta ng pagpapatupad ng script ay magiging available habang tumatakbo ang plano. Upang i-install ang script, inilalarawan muna namin ang block:

Ilarawan natin ang pag-install ng 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"

]

}

At agad naming ilalarawan ang pag-update ng Bitrix.

Isang halimbawa ng 1C-Bitrix provisioning.

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"

]

}

}

Mahalaga! Maaaring hindi gumana ang script kung hindi mo i-disable nang maaga ang SELinux! Kung kailangan mo ng detalyadong artikulo sa pag-install at pag-configure ng CMS 1C-Bitrix gamit ang bitrix-env.sh, maaari mo gamitin ang aming artikulo sa blog sa website.

3. Pagsisimula ng imprastraktura

Paano Pamahalaan ang Cloud Infrastructure gamit ang TerraformPagsisimula ng mga module at plugin

Para sa trabaho, gumagamit kami ng isang simpleng "gentleman's kit": isang laptop na may Windows 10 OS at isang distribution kit mula sa opisyal na website terraform.io. I-unpack at simulan natin gamit ang command: terraform.exe init

Pagkatapos ilarawan ang computing at network infrastructure, inilunsad namin ang pagpaplano upang subukan ang aming configuration, kung saan makikita namin kung ano ang gagawin at kung paano ito ikokonekta sa isa't isa.

  1. Isagawa ang utos - terraform plan -var-file=vcd.tfvars.

  2. Nakukuha namin ang resulta - Plan: 16 to add, 0 to change, 0 to destroy. Ibig sabihin, ayon sa planong ito, 16 na mapagkukunan ang malilikha.

  3. Inilunsad namin ang plan on command - terraform.exe apply -var-file=vcd.tfvars.

Gagawin ang mga virtual machine, at pagkatapos ay isasagawa ang mga nakalistang package sa loob ng seksyon ng provisioner - ia-update ang OS at mai-install ang CMS Bitrix.

Pagtanggap ng impormasyon sa koneksyon

Matapos maisagawa ang plano, nais naming makatanggap ng data sa form ng teksto para sa pagkonekta sa mga server, para dito i-format namin ang seksyon ng output tulad ng sumusunod:

output "nginxpassword" {

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

}

At ang sumusunod na output ay nagsasabi sa amin ng password para sa nilikha na virtual machine:

Outputs: nginx_password = F#4u8!!N

Bilang resulta, nakakakuha kami ng access sa mga virtual machine na may na-update na operating system at mga paunang naka-install na package para sa aming karagdagang trabaho. Handa na ang lahat!

Ngunit paano kung mayroon ka nang umiiral na imprastraktura?

3.1. Paggawa ng Terraform gamit ang kasalukuyang imprastraktura

Ito ay simple, maaari kang mag-import ng mga kasalukuyang virtual machine at ang kanilang mga vApp container gamit ang import command.

Ilarawan natin ang mapagkukunan ng vAPP at ang 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"

}

Ang susunod na hakbang ay ang pag-import ng mga katangian ng mga mapagkukunan ng vApp sa format vcdvapp.<vApp> <org>.<orgvdc>.<vApp>, kung saan:

  • vApp - pangalan ng vApp;

  • org — pangalan ng organisasyon;

  • org_vdc — pangalan ng virtual data center.

Paano Pamahalaan ang Cloud Infrastructure gamit ang TerraformPag-import ng mga katangian ng mapagkukunan ng vAPP

I-import natin ang mga katangian ng mga mapagkukunan ng VM sa format: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>, kung saan:

  • VM - pangalan ng VM;

  • vApp - pangalan ng vApp;

  • org — pangalan ng organisasyon;

  • orgvdc ay ang pangalan ng virtual data center.

Naging matagumpay ang pag-import

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.

Ngayon ay maaari nating tingnan ang bagong na-import na mapagkukunan:

Na-import na mapagkukunan

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

}

}

Ngayon ay tiyak na handa na kami - tapos na kami sa huling punto (pag-import sa umiiral na imprastraktura) at isinasaalang-alang ang lahat ng mga pangunahing punto ng pakikipagtulungan sa Terraform. 

Ang tool ay naging napaka-maginhawa at nagbibigay-daan sa iyong ilarawan ang iyong imprastraktura bilang code, simula sa mga virtual machine ng isang cloud provider hanggang sa paglalarawan ng mga mapagkukunan ng mga bahagi ng network.

Kasabay nito, ang pagsasarili mula sa kapaligiran ay ginagawang posible na magtrabaho kasama ang mga lokal na mapagkukunan ng ulap, at kahit na pamahalaan ang platform. At kung walang sinusuportahang platform at gusto mong magdagdag ng bago, maaari kang sumulat ng sarili mong provider at gamitin ito.

Pinagmulan: www.habr.com

Magdagdag ng komento