Ինչպես կառավարել ամպային ենթակառուցվածքը Terraform-ի հետ

Ինչպես կառավարել ամպային ենթակառուցվածքը Terraform-ի հետ

Այս հոդվածում մենք կանդրադառնանք, թե ինչից է բաղկացած Terraform-ը, ինչպես նաև աստիճանաբար կգործարկենք մեր սեփական ենթակառուցվածքը ամպի մեջ VMware-ով — մենք կպատրաստենք երեք VM տարբեր նպատակների համար՝ պրոքսի, ֆայլերի պահեստավորում և CMS:

Ամեն ինչի մասին մանրամասն և երեք փուլով.

1. Terraform - նկարագրություն, առավելություններ և բաղադրիչներ

Terraform-ը IaC (Ենթակառուցվածք-որպես կոդ) գործիք է՝ կոդ օգտագործելով վիրտուալ ենթակառուցվածքի կառուցման և կառավարման համար:

Մենք նշել ենք գործիքի հետ աշխատելու մի քանի առավելություն.

  • Նոր վարձակալների տեղակայման արագությունը (պատվերով վիրտուալ միջավայրեր): Սովորաբար, որքան շատ նոր հաճախորդներ լինեն, այնքան ավելի շատ «կտտանքներ» պետք է կատարի տեխնիկական աջակցության անձնակազմը՝ նոր ռեսուրսներ հրապարակելու համար: Terraform-ի միջոցով օգտատերերը կարող են փոխել վիրտուալ մեքենայի կարգավորումները (օրինակ՝ ավտոմատ կերպով անջատել ՕՀ-ն և ավելացնել վիրտուալ սկավառակի բաժանումը)՝ առանց տեխնիկական աջակցություն պահանջելու կամ ինքնին մեքենան անջատելու:

  • Ակտիվացման պլանի ակնթարթային ստուգում նոր վարձակալ. Օգտվելով ենթակառուցվածքի կոդի նկարագրությունից՝ մենք կարող ենք անմիջապես ստուգել, ​​թե ինչ կավելացվի և ինչ հերթականությամբ, ինչպես նաև ինչ վերջնական վիճակում կլինի այս կամ այն ​​վիրտուալ մեքենան կամ վիրտուալ մեքենաներին միացված վիրտուալ ցանցը։

  • Ամենահայտնի ամպային հարթակները նկարագրելու ունակություն: Դուք կարող եք օգտագործել գործիքը Amazon-ից և Google Cloud-ից մինչև VMware vCloud Director-ի վրա հիմնված մասնավոր հարթակներ, որոնք ծառայություններ են առաջարկում IaaS, SaaS և PaaS լուծումների շրջանակներում:

  • Կառավարեք բազմաթիվ ամպային մատակարարներ և բաշխել ենթակառուցվածքը նրանց միջև՝ սխալների հանդուրժողականությունը բարելավելու համար՝ օգտագործելով մեկ կոնֆիգուրացիա՝ ամպային ռեսուրսներ ստեղծելու, ախտորոշելու և կառավարելու համար:

  • Հարմարավետ օգտագործումը ցուցադրական ստենդներ ստեղծելու համար ծրագրային ապահովման փորձարկման և վրիպազերծման համար: Դուք կարող եք ստեղծել և փոխանցել ստենդներ թեստավորման բաժնի համար, զուգահեռաբար փորձարկել ծրագրակազմը տարբեր միջավայրերում և ակնթարթորեն փոխել և ջնջել ռեսուրսները՝ ստեղծելով ընդամենը մեկ ռեսուրսների կառուցման պլան:

«Տեռարիում» Terraform

Մենք հակիրճ խոսեցինք գործիքի առավելությունների մասին, այժմ եկեք այն բաժանենք իր բաղադրիչների

Մատակարարներ. 

Terraform-ում գրեթե ցանկացած տեսակի ենթակառուցվածք կարող է ներկայացվել որպես ռեսուրս: Ռեսուրսների և API պլատֆորմի միջև կապն ապահովվում է պրովայդերների մոդուլներով, որոնք թույլ են տալիս ստեղծել ռեսուրսներ կոնկրետ հարթակի ներսում, օրինակ՝ Azure կամ VMware vCloud Director:

Որպես նախագծի մաս՝ դուք կարող եք տարբեր հարթակներում տարբեր պրովայդերների հետ շփվել:

Ռեսուրսներ (ռեսուրսների նկարագրություն).

Ռեսուրսների նկարագրությունը թույլ է տալիս կառավարել հարթակի բաղադրիչները, ինչպիսիք են վիրտուալ մեքենաները կամ ցանցերը: 

Դուք կարող եք ինքներդ ստեղծել ռեսուրսի նկարագրություն VMware vCloud Director մատակարարի համար և օգտագործել այս նկարագրությունը՝ ցանկացած հոսթինգ մատակարարի հետ ստեղծելու համար, որն օգտագործում է vCloud Director: Դուք միայն պետք է փոխեք նույնականացման պարամետրերը և ցանցային կապի պարամետրերը պահանջվող հոսթինգ մատակարարին

Մատակարարներ.

Այս բաղադրիչը հնարավորություն է տալիս վիրտուալ մեքենաներ ստեղծելուց հետո կատարել օպերացիոն համակարգի սկզբնական տեղադրման և սպասարկման գործողություններ: Վիրտուալ մեքենայի ռեսուրս ստեղծելուց հետո կարող եք օգտագործել պրովայդերներ SSH-ի միջոցով կարգավորելու և միանալու, օպերացիոն համակարգը թարմացնելու և սկրիպտը ներբեռնելու և գործարկելու համար: 

Մուտքային և ելքային փոփոխականներ:

Ներածման փոփոխականներ - մուտքային փոփոխականներ ցանկացած տեսակի բլոկի համար: 

Ելքային փոփոխականները թույլ են տալիս պահպանել արժեքները ռեսուրսներ ստեղծելուց հետո և կարող են օգտագործվել որպես մուտքային փոփոխականներ այլ մոդուլներում, օրինակ՝ Provisioners բլոկում:

նահանգներ.

Պետությունների ֆայլերը պահում են տեղեկատվություն մատակարարի հարթակի ռեսուրսների կազմաձևման մասին: Երբ հարթակը առաջին անգամ ստեղծվում է, ռեսուրսների մասին տեղեկատվություն չկա, և ցանկացած գործողությունից առաջ Terraform-ը թարմացնում է վիճակը արդեն նկարագրված ռեսուրսների իրական ենթակառուցվածքով:

Պետությունների հիմնական նպատակն է պահպանել արդեն ստեղծված ռեսուրսների մի շարք օբյեկտներ՝ համեմատելու ավելացված ռեսուրսների և օբյեկտների կազմաձևումը, որպեսզի խուսափեն հարթակի կրկնվող ստեղծումից և փոփոխություններից:

Լռելյայնորեն, պետական ​​տեղեկատվությունը պահվում է տեղական terraform.tfstate ֆայլում, սակայն անհրաժեշտության դեպքում հնարավոր է օգտագործել հեռավոր պահեստավորում թիմային աշխատանքի համար:

Դուք կարող եք նաև պլատֆորմի ընթացիկ ռեսուրսները ներմուծել վիճակ՝ այլ ռեսուրսների հետ հետագա համագործակցության համար, որոնք իրենց հերթին ստեղծվել են առանց Terraform-ի օգնության:  

2. Ենթակառուցվածքների ստեղծում

Բաղադրիչները դասավորված են, այժմ Terraform-ի միջոցով մենք աստիճանաբար կստեղծենք ենթակառուցվածք երեք վիրտուալ մեքենաներով: Առաջինը՝ տեղադրված nginx պրոքսի սերվերով, երկրորդը՝ Nextcloud-ի վրա հիմնված ֆայլերի պահպանմամբ, իսկ երրորդը՝ CMS Bitrix-ով:

Մենք կգրենք կոդը և կկատարենք այն մեր օրինակով ամպեր VMware vCloud Director-ի վրա. Մեր օգտվողները ստանում են հաշիվ Կազմակերպության ադմինիստրատորի իրավունքներով: Եթե դուք օգտագործում եք նույն իրավունքներով հաշիվ մեկ այլ VMware ամպում, կարող եք վերարտադրել կոդը մեր օրինակներից: Գնա՛

Նախ, եկեք ստեղծենք գրացուցակ մեր նոր նախագծի համար, որտեղ կտեղադրվեն ենթակառուցվածքը նկարագրող ֆայլերը:

mkdir project01

Հաջորդը, մենք նկարագրում ենք ենթակառուցվածքի բաղադրիչները: Terraform-ը ստեղծում է հարաբերություններ և մշակում ֆայլեր՝ հիմնվելով ֆայլերի նկարագրության վրա: Ֆայլերն իրենք կարող են անվանվել՝ ելնելով նկարագրվող բլոկների նպատակից, օրինակ՝ network.tf - նկարագրում է ենթակառուցվածքի ցանցի պարամետրերը:

Մեր ենթակառուցվածքի բաղադրիչները նկարագրելու համար մենք ստեղծեցինք հետևյալ ֆայլերը.

Ֆայլերի ցանկ.

main.tf - վիրտուալ միջավայրի պարամետրերի նկարագրություն - վիրտուալ մեքենաներ, վիրտուալ կոնտեյներներ;

network.tf - վիրտուալ ցանցի պարամետրերի և NAT-ի և Firewall-ի կանոնների նկարագրություն;

variables.tf - փոփոխականների ցանկ, որոնք մենք օգտագործում ենք;

vcd.tfvars - նախագծի փոփոխական արժեքներ VMware vCloud Director մոդուլի համար:

Terraform-ում կազմաձևման լեզուն դեկլարատիվ է, և բլոկների հերթականությունը կարևոր չէ, բացառությամբ մատակարարող բլոկների, քանի որ Այս բլոկում մենք նկարագրում ենք ենթակառուցվածքը պատրաստելիս կատարվող հրամանները, և դրանք կկատարվեն հերթականությամբ:

Բլոկի կառուցվածքը.

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

# Block body

<IDENTIFIER> = <EXPRESSION> # Argument

}

Բլոկները նկարագրելու համար օգտագործվում է իր սեփական ծրագրավորման լեզուն HCL (HashiCorp Configuration Language), հնարավոր է ենթակառուցվածքը նկարագրել JSON-ի միջոցով: Դուք կարող եք ավելին իմանալ շարահյուսության մասին կարդացեք մշակողի կայքում.

Շրջակա միջավայրի փոփոխականի կոնֆիգուրացիա, variables.tf և vcd.tfvars

Նախ, եկեք ստեղծենք երկու ֆայլ, որոնք նկարագրում են բոլոր օգտագործված փոփոխականների ցանկը և դրանց արժեքները VMware vCloud Director մոդուլի համար: Նախ, եկեք ստեղծենք variables.tf ֆայլը:

variables.tf ֆայլի բովանդակությունը:

variable "vcd_org_user" {

  description = "vCD Tenant User"

}

variable "vcd_org_password" {

  description = "vCD Tenant Password"

}

variable "vcd_org" {

  description = "vCD Tenant Org"

}

variable "vcd_org_vdc" {

  description = "vCD Tenant VDC"

}

variable "vcd_org_url" {

  description = "vCD Tenant URL"

}

variable "vcd_org_max_retry_timeout" {

  default = "60"

}

variable "vcd_org_allow_unverified_ssl" {

  default = "true"

}

variable "vcd_org_edge_name" {

  description = "vCD edge name"

}

variable "vcd_org_catalog" {

  description = "vCD public catalog"

}

variable "vcd_template_os_centos7" {

  description = "OS CentOS 7"

  default = "CentOS7"

}

variable "vcd_org_ssd_sp" {

  description = "Storage Policies"

  default = "Gold Storage Policy"

}

variable "vcd_org_hdd_sp" {

  description = "Storage Policies"

  default = "Bronze Storage Policy"

}

variable "vcd_edge_local_subnet" {

  description = "Organization Network Subnet"

}

variable "vcd_edge_external_ip" {

  description = "External public IP"

}

variable "vcd_edge_local_ip_nginx" {}

variable "vcd_edge_local_ip_bitrix" {}

variable "vcd_edge_local_ip_nextcloud" {}

variable "vcd_edge_external_network" {}

Փոփոխական արժեքներ, որոնք մենք ստանում ենք մատակարարից:

  • vcd_org_user — օգտանուն՝ կազմակերպության ադմինիստրատորի իրավունքներով,

  • vcd_org_password — օգտվողի գաղտնաբառ,

  • vcd_org - կազմակերպության անվանումը,

  • vcd_org_vdc — վիրտուալ տվյալների կենտրոնի անվանումը,

  • vcd_org_url - API URL,

  • vcd_org_edge_name — վիրտուալ երթուղիչի անունը,

  • vcd_org_catalog — վիրտուալ մեքենայի կաղապարներով գրացուցակի անվանումը,

  • vcd_edge_external_ip — հանրային IP հասցե,

  • vcd_edge_external_network — արտաքին ցանցի անվանումը,

  • vcd_org_hdd_sp — HDD-ի պահպանման քաղաքականության անվանումը,

  • vcd_org_ssd_sp — SSD պահպանման քաղաքականության անվանումը:

Եվ մուտքագրեք մեր փոփոխականները.

  • vcd_edge_local_ip_nginx — NGINX-ով վիրտուալ մեքենայի IP հասցեն,

  • vcd_edge_local_ip_bitrix - վիրտուալ մեքենայի IP հասցեն 1C-ով. Bitrix,

  • vcd_edge_local_ip_nextcloud — Nextcloud-ով վիրտուալ մեքենայի IP հասցեն:

Երկրորդ ֆայլով մենք ստեղծում և նշում ենք փոփոխականներ VMware vCloud Director մոդուլի համար vcd.tfvars ֆայլում. Հիշենք, որ մեր օրինակում մենք օգտագործում ենք. սեփական ամպային mClouds, եթե աշխատում եք այլ մատակարարի հետ, ստուգեք արժեքները նրանց հետ։ 

vcd.tfvars ֆայլի բովանդակությունը:

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

vcd_org_user = "orgadmin"

vcd_org_password = "*"

vcd = "org"

vcd_org_vdc = "orgvdc"

vcd_org_maxretry_timeout = 60

vcd_org_allow_unverified_ssl = true

vcd_org_catalog = "Templates"

vcd_templateos_centos7 = "CentOS7"

vcd_org_ssd_sp = "Gold Storage Policy"

vcd_org_hdd_sp = "Bronze Storage Policy"

vcd_org_edge_name = "MCLOUDS-EDGE"

vcd_edge_external_ip = "185.17.66.1"

vcd_edge_local_subnet = "192.168.110.0/24"

vcd_edge_local_ip_nginx = "192.168.110.1"

vcd_edge_local_ip_bitrix = "192.168.110.10"

vcd_edge_local_ip_nextcloud = "192.168.110.11"

vcd_edge_external_network = "NET-185-17-66-0"

Ցանցի կոնֆիգուրացիա, network.tf.

Շրջակա միջավայրի փոփոխականները սահմանված են, այժմ մենք կստեղծենք վիրտուալ մեքենայի միացման սխեման. մենք յուրաքանչյուր վիրտուալ մեքենային կնշանակենք մասնավոր IP հասցե և կօգտագործենք Destination NAT-ը՝ նավահանգիստները արտաքին ցանց «փոխանցելու» համար: Կառավարման նավահանգիստների մուտքը սահմանափակելու համար մենք մուտքը կսահմանենք միայն մեր IP հասցեի համար:

Ինչպես կառավարել ամպային ենթակառուցվածքը Terraform-ի հետՍտեղծվում է Terraform հարթակի ցանցային դիագրամ

Մենք ստեղծում ենք վիրտուալ կազմակերպչական ցանց net_lan01 անունով, լռելյայն դարպաս՝ 192.168.110.254, ինչպես նաև հասցեի տարածություն՝ 192.168.110.0/24:

Մենք նկարագրում ենք վիրտուալ ցանց:

resource "vcd_network_routed" "net" {

  name = "net_lan01"

  edge_gateway = var.vcd_org_edge_name

  gateway = "192.168.110.254"

  dns1 = "1.1.1.1"

  dns2 = "8.8.8.8"

 static_ip_pool {

start_address = "192.168.110.1"

end_address = "192.168.110.253"

  }

}

Եկեք ստեղծենք firewall-ի կանոններ, որոնք թույլ են տալիս վիրտուալ մեքենաներին մուտք գործել ինտերնետ: Այս բլոկի ներսում ամպի բոլոր վիրտուալ ռեսուրսները մուտք կունենան ինտերնետ.

Մենք նկարագրում ենք VM ինտերնետ մուտք գործելու կանոնները:

resource "vcd_nsxv_firewall_rule" "fw_internet_access" {

  edge_gateway   = var.vcdorgedgename

  name = "Internet Access"

  source {

gateway_interfaces = ["internal"]

  }

  destination {

gateway_interfaces = ["external"]

  }

  service {

protocol = "any"

  }

  depends_on = [vcdnetworkrouted.net]

}

Կախվածություն հաստատելով, որ vcdnetworkrouted.net բլոկը մշակելուց հետո մենք անցնում ենք կարգավորելու vcdnsxvfirewallrule բլոկը:, օգտագործելով կախված է նրանից. Մենք օգտագործում ենք այս տարբերակը, քանի որ որոշ կախվածություններ կարող են անուղղակիորեն ճանաչվել կազմաձևում:

Հաջորդը, մենք կստեղծենք կանոններ, որոնք թույլ են տալիս մուտք գործել նավահանգիստներ արտաքին ցանցից և նշելու մեր IP հասցեն՝ SSH-ի միջոցով սերվերներին միանալու համար: Ինտերնետից ցանկացած օգտվող մուտք ունի վեբ սերվերի 80 և 443 նավահանգիստներ, իսկ 90.1.15.1 IP հասցե ունեցող օգտվողը մուտք ունի դեպի վիրտուալ սերվերների SSH պորտերը:

Թույլատրել մուտք դեպի նավահանգիստներ արտաքին ցանցից:

resource "vcd_nsxv_firewall_rule" "fwnatports" {

  edge_gateway   = var.vcd_org_edge_name

  name = "HTTPs Access"

  source {

gateway_interfaces = ["external"]

  }

  destination {

  gateway_interfaces = ["internal"]

  }

  service {

protocol = "tcp"

port = "80"

  }

  service {

protocol = "tcp"

port = "443"

  }

  depends_on = [vcd_network_routed.net]

}

resource "vcd_nsxv_firewall_rule" "fw_nat_admin_ports" {

  edge_gateway   = var.vcd_org_edge_name

  name = "Admin Access"

  source {

  ip_addresses = [ "90.1.15.1" ]

  }

  destination {

  gateway_interfaces = ["internal"]

  }

  service {

protocol = "tcp"

port = "58301"

  }

  service {

protocol = "tcp"

port = "58302"

  }

  service {

protocol = "tcp"

port = "58303"

  }

  depends_on = [vcd_network_routed.net]

}

Մենք ստեղծում ենք Source NAT կանոններ՝ ամպային տեղական ցանցից ինտերնետ մուտք գործելու համար.

Մենք նկարագրում ենք Source NAT կանոնները:

resource "vcd_nsxv_snat" "snat_local" {

edge_gateway = var.vcd_org_edge_name

  network_type = "ext"

  network_name = var.vcdedgeexternalnetwork

  original_address   = var.vcd_edge_local_subnet

translated_address = var.vcd_edge_external_ip

  depends_on = [vcd_network_routed.net]

}

Եվ ցանցի բլոկի կազմաձևումն ավարտելու համար մենք ավելացնում ենք Destination NAT կանոնները արտաքին ցանցից ծառայություններ մուտք գործելու համար.

Նշանակման NAT կանոնների ավելացում:

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

  description = "NGINX HTTPs"

original_address = var.vcd_edge_external_ip
original_port = 443

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

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

description = "NGINX HTTP"

original_address = var.vcd_edge_external_ip
original_port = 80

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

depends_on = [vcd_network_routed.net]

}

Nginx-ի տակ SSH սերվերին պորտի թարգմանության համար ավելացրեք NAT կանոն:

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]

}

SSH սերվերին 1C-Bitrix-ով ավելացրեք NAT կանոն՝ նավահանգիստների թարգմանության համար:

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]

}

Nextcloud-ի միջոցով SSH սերվերին պորտի թարգմանության համար ավելացրեք NAT կանոն:

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

description = "SSH Nextcloud"

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

depends_on = [vcd_network_routed.net]

}

Main.tf վիրտուալ միջավայրի կազմաձևում

Ինչպես նախատեսել էինք հոդվածի սկզբում, մենք կստեղծենք երեք վիրտուալ մեքենաներ: Դրանք կպատրաստվեն «Հյուրերի անհատականացման» միջոցով: Մենք կսահմանենք ցանցի պարամետրերը ըստ մեր նշած կարգավորումների, և օգտատիրոջ գաղտնաբառը ավտոմատ կերպով կստեղծվի:

Եկեք նկարագրենք vApp-ը, որում կտեղակայվեն վիրտուալ մեքենաները և դրանց կոնֆիգուրացիան:

Ինչպես կառավարել ամպային ենթակառուցվածքը Terraform-ի հետՎիրտուալ մեքենայի կոնֆիգուրացիա

Եկեք ստեղծենք vApp կոնտեյներ: Որպեսզի մենք կարողանանք անմիջապես միացնել vApp-ը և VM-ը վիրտուալ ցանցին, ավելացնում ենք նաև կախված_on պարամետրը.

Ստեղծեք կոնտեյներ

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

}

Եկեք ստեղծենք վիրտուալ մեքենա՝ նկարագրությամբ

resource "vcd_vapp_vm" "nginx" {

vapp_name = vcd_vapp.vapp.name

name = "nginx"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_nginx

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "32768"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

VM նկարագրության հիմնական պարամետրերը.

  • անվանումը — վիրտուալ մեքենայի անվանումը,

  • vappname - vApp-ի անվանումը, որին պետք է ավելացնել նոր VM,

  • կատալոգի անուն / ձևանմուշ - կատալոգի անվանում և վիրտուալ մեքենայի ձևանմուշի անվանում,

  • storageprofile - լռելյայն պահպանման քաղաքականություն:

Ցանցի բլոկի պարամետրերը.

  • տեսակ — միացված ցանցի տեսակ,

  • անունը — որ վիրտուալ ցանցին միացնել VM-ը,

  • isprimary - առաջնային ցանցային ադապտեր,

  • ipallocation_mode — MANUAL / DHCP / POOL հասցեների տեղաբաշխման ռեժիմ,

  • ip — վիրտուալ մեքենայի IP հասցե, մենք այն ձեռքով կնշենք:

override_template_disk բլոկ՝

  • sizeinmb — վիրտուալ մեքենայի բեռնման սկավառակի չափը

  • storage_profile — սկավառակի պահպանման քաղաքականություն

Եկեք ստեղծենք երկրորդ VM՝ Nextcloud ֆայլի պահպանման նկարագրությամբ

resource "vcd_vapp_vm" "nextcloud" {

vapp_name = vcd_vapp.vapp.name

name = "nextcloud"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_nextcloud

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "32768"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

resource "vcd_vm_internal_disk" "disk1" {

vapp_name = vcd_vapp.vapp.name

vm_name = "nextcloud"

bus_type = "paravirtual"

size_in_mb = "102400"

bus_number = 0

unit_number = 1

storage_profile = var.vcd_org_hdd_sp

allow_vm_reboot = true

depends_on = [ vcd_vapp_vm.nextcloud ]

}

vcdvminternal_disk բաժնում մենք կնկարագրենք նոր վիրտուալ սկավառակ, որը միացված է վիրտուալ մեքենային:

Բացատրություններ vcdvminternaldisk բլոկի համար.

  • bustype - սկավառակի վերահսկիչի տեսակը

  • sizeinmb — սկավառակի չափ

  • busnumber / unitnumber - միացման վայրը ադապտերում

  • storage_profile — սկավառակի պահպանման քաղաքականություն

Եկեք նկարագրենք Bitrix-ի վերջին VM-ը

resource "vcd_vapp_vm" "bitrix" {

vapp_name = vcd_vapp.vapp.name

name = "bitrix"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_bitrix

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "81920"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

ՕՀ-ի թարմացում և լրացուցիչ սկրիպտների տեղադրում

Ցանցը պատրաստված է, նկարագրված են վիրտուալ մեքենաները։ Նախքան մեր ենթակառուցվածքը ներմուծելը, մենք կարող ենք նախօրոք նախնական մատակարարում կատարել՝ օգտագործելով մատակարարների բլոկները և առանց Ansible-ի օգտագործման:

Եկեք նայենք, թե ինչպես կարելի է թարմացնել ՕՀ-ն և գործարկել CMS Bitrix-ի տեղադրման սցենարը՝ օգտագործելով պրովայդերների բլոկը:

Նախ, եկեք տեղադրենք 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" ]

}

}

}

Բաղադրիչների նշանակում.

  • մատակարար «Remote-exec» - միացրեք հեռակառավարման բլոկը

  • Միացման բլոկում մենք նկարագրում ենք կապի տեսակը և պարամետրերը.

  • տեսակ — արձանագրություն, մեր դեպքում SSH;

  • օգտվող - օգտվողի անուն;

  • գաղտնաբառ — օգտագործողի գաղտնաբառը: Մեր դեպքում մենք մատնանշում ենք vcdvappvm.nginx.customization[0].admin_password պարամետրը, որը պահպանում է գեներացված գաղտնաբառը համակարգի օգտագործողի համար:

  • հոսթ - արտաքին IP հասցե միացման համար;

  • նավահանգիստ — միացման պորտ, որը նախկինում նշված էր DNAT կարգավորումներում;

  • inline - նշեք այն հրամանների ցանկը, որոնք մուտքագրվելու են: Հրամանները մուտքագրվելու են այս բաժնում նշված հերթականությամբ:

Որպես օրինակ, եկեք լրացուցիչ գործարկենք 1C-Bitrix տեղադրման սցենարը: Սցենարի կատարման արդյունքի արդյունքը հասանելի կլինի պլանի գործարկման ընթացքում: Սցենարը տեղադրելու համար նախ նկարագրում ենք բլոկը.

Եկեք նկարագրենք 1C-Bitrix-ի տեղադրումը:

provisioner "file" {

source = "prepare.sh"

destination = "/tmp/prepare.sh"

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.nginx.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58301"

timeout = "30s"

}

}

provisioner "remote-exec" {

inline = [

"chmod +x /tmp/prepare.sh", "./tmp/prepare.sh"

]

}

Եվ մենք անմիջապես նկարագրելու ենք Bitrix թարմացումը:

1C-Bitrix-ի տրամադրման օրինակ:

resource "null_resource" "install_update_bitrix" {

provisioner "remote-exec" {

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.bitrix.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58302"

timeout = "60s"

}

inline = [

"yum -y update && yum -y upgrade",

"yum -y install wget nano epel-release net-tools unzip zip",

"wget http://repos.1c-bitrix.ru/yum/bitrix-env.sh -O /tmp/bitrix-env.sh",

"chmod +x /tmp/bitrix-env.sh",

"/tmp/bitrix-env.sh"

]

}

}

Կարևոր! Սցենարը կարող է չաշխատել, եթե նախապես չանջատեք SELinux-ը: Եթե ​​Ձեզ անհրաժեշտ է մանրամասն հոդված CMS 1C-Bitrix-ի տեղադրման և կազմաձևման վերաբերյալ bitrix-env.sh-ի միջոցով, կարող եք օգտագործեք մեր բլոգի հոդվածը կայքում.

3. Ենթակառուցվածքի սկզբնավորում

Ինչպես կառավարել ամպային ենթակառուցվածքը Terraform-ի հետՄոդուլների և պլագինների սկզբնավորում

Աշխատանքի համար մենք օգտագործում ենք պարզ «ջենթլմենների հավաքածու»՝ Windows 10 ՕՀ-ով նոութբուք և պաշտոնական կայքի բաշխման հավաքածու: terraform.io. Եկեք ապափաթեթավորենք և նախաստորագրենք՝ օգտագործելով հրամանը. terraform.exe init

Հաշվողական և ցանցային ենթակառուցվածքը նկարագրելուց հետո մենք սկսում ենք մեր կոնֆիգուրացիան փորձարկելու պլանավորումը, որտեղ մենք կարող ենք տեսնել, թե ինչ է ստեղծվելու և ինչպես է այն կապվելու միմյանց հետ:

  1. Կատարեք հրամանը - terraform plan -var-file=vcd.tfvars.

  2. Մենք ստանում ենք արդյունքը - Plan: 16 to add, 0 to change, 0 to destroy. Այսինքն՝ ըստ այս պլանի, կստեղծվի 16 ռեսուրս։

  3. Մենք գործարկում ենք պլանը հրամանով - terraform.exe apply -var-file=vcd.tfvars.

Կստեղծվեն վիրտուալ մեքենաներ, այնուհետև մեր թվարկած փաթեթները կկատարվեն մատակարարների բաժնում. ՕՀ-ն կթարմացվի և կտեղադրվի CMS Bitrix-ը:

Միացման տեղեկատվության ստացում

Պլանը կատարելուց հետո մենք ցանկանում ենք տվյալներ ստանալ տեքստային ձևով՝ սերվերներին միանալու համար, դրա համար ելքային բաժինը ձևաչափելու ենք հետևյալ կերպ.

output "nginxpassword" {

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

}

Եվ հետևյալ ելքը մեզ ասում է ստեղծված վիրտուալ մեքենայի գաղտնաբառը.

Outputs: nginx_password = F#4u8!!N

Արդյունքում մենք մուտք ենք ստանում վիրտուալ մեքենաներ՝ թարմացված օպերացիոն համակարգով և նախապես տեղադրված փաթեթներով՝ մեր հետագա աշխատանքի համար: Ամեն ինչ պատրաստ է:

Բայց ինչ անել, եթե դուք արդեն ունեք գոյություն ունեցող ենթակառուցվածք:

3.1. Աշխատանքային Terraform-ը առկա ենթակառուցվածքով

Դա պարզ է, դուք կարող եք ներմուծել ընթացիկ վիրտուալ մեքենաներ և դրանց vApp կոնտեյներները՝ օգտագործելով ներմուծման հրամանը:

Եկեք նկարագրենք vAPP ռեսուրսը և վիրտուալ մեքենան:

resource "vcd_vapp" "Monitoring" {

name = "Monitoring"

org = "mClouds"

vdc = "mClouds"

}

resource "vcd_vapp_vm" "Zabbix" {

name = "Zabbix"

org = "mClouds"

vdc = "mClouds"

vapp = "Monitoring"

}

Հաջորդ քայլը vApp ռեսուրսների հատկությունները ձևաչափով ներմուծելն է vcdvapp.<vApp> <org>.<orgvdc>.<vApp>, Որտեղ:

  • vApp - vApp անունը;

  • org - կազմակերպության անվանումը;

  • org_vdc - վիրտուալ տվյալների կենտրոնի անվանումը:

Ինչպես կառավարել ամպային ենթակառուցվածքը Terraform-ի հետvAPP ռեսուրսի հատկությունների ներմուծում

Ներմուծենք VM ռեսուրսների հատկությունները ձևաչափով. vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>, որի մեջ:

  • VM - VM անունը;

  • vApp - vApp անունը;

  • org - կազմակերպության անվանումը;

  • orgvdc-ն վիրտուալ տվյալների կենտրոնի անունն է:

Ներմուծումը հաջող էր

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

vcd_vapp_vm.Zabbix: Importing from ID "mClouds.mClouds.Monitoring.Zabbix"...

vcd_vapp_vm.Zabbix: Import prepared!

Prepared vcd_vapp_vm for import

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

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

Այժմ մենք կարող ենք դիտել ներմուծված նոր ռեսուրսը.

Ներմուծված ռեսուրս

> terraform show

...

# vcd_vapp.Monitoring:

resource "vcd_vapp" "Monitoring" {

guest_properties = {}

href = "https://vcloud.mclouds.ru/api/vApp/vapp-fe5db285-a4af-47c4-93e8-55df92f006ec"

id = "urn:vcloud:vapp:fe5db285-a4af-47c4-93e8-55df92f006ec"

ip = "allocated"

metadata = {}

name = "Monitoring"

org = "mClouds"

status = 4

status_text = "POWERED_ON"

vdc = "mClouds"

}

# vcd_vapp_vm.Zabbix:

resource "vcd_vapp_vm" "Zabbix" {

computer_name = "Zabbix"

cpu_cores = 1

cpus = 2

expose_hardware_virtualization = false

guest_properties = {}

hardware_version = "vmx-14"

href = "https://vcloud.mclouds.ru/api/vApp/vm-778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

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

internal_disk = [

{

bus_number = 0

bus_type = "paravirtual"

disk_id = "2000"

iops = 0

size_in_mb = 122880

storage_profile = "Gold Storage Policy"

thin_provisioned = true

unit_number = 0

},

]

memory = 8192

metadata = {}

name = "Zabbix"

org = "mClouds"

os_type = "centos8_64Guest"

storage_profile = "Gold Storage Policy"

vapp_name = "Monitoring"

vdc = "mClouds"

customization {

allow_local_admin_password = true

auto_generate_password = true

change_sid = false

enabled = false

force = false

join_domain = false

join_org_domain = false

must_change_password_on_first_login = false

number_of_auto_logons = 0

}

network {

adapter_type = "VMXNET3"

ip_allocation_mode = "DHCP"

is_primary = true

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

name = "MCLOUDS-LAN01"

type = "org"

}

}

Այժմ մենք միանշանակ պատրաստ ենք. մենք ավարտեցինք վերջին կետը (ներմուծումը գործող ենթակառուցվածք) և դիտարկել ենք Terraform-ի հետ աշխատելու բոլոր հիմնական կետերը: 

Գործիքը պարզվեց, որ շատ հարմար է և թույլ է տալիս նկարագրել ձեր ենթակառուցվածքը որպես կոդ՝ սկսած մեկ ամպային մատակարարի վիրտուալ մեքենաներից մինչև ցանցի բաղադրիչների ռեսուրսների նկարագրությունը։

Միևնույն ժամանակ, շրջակա միջավայրից անկախությունը հնարավորություն է տալիս աշխատել տեղական, ամպային ռեսուրսների հետ և նույնիսկ կառավարել հարթակը։ Իսկ եթե չկա աջակցվող հարթակ, և ցանկանում եք ավելացնել նորը, կարող եք գրել ձեր սեփական պրովայդերը և օգտագործել այն։

Source: www.habr.com

Добавить комментарий