Այս հոդվածում մենք կանդրադառնանք, թե ինչից է բաղկացած Terraform-ը, ինչպես նաև աստիճանաբար կգործարկենք մեր սեփական ենթակառուցվածքը
Ամեն ինչի մասին մանրամասն և երեք փուլով.
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-ով:
Մենք կգրենք կոդը և կկատարենք այն մեր օրինակով
Նախ, եկեք ստեղծենք գրացուցակ մեր նոր նախագծի համար, որտեղ կտեղադրվեն ենթակառուցվածքը նկարագրող ֆայլերը:
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 ֆայլում. Հիշենք, որ մեր օրինակում մենք օգտագործում ենք.
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 հարթակի ցանցային դիագրամ
Մենք ստեղծում ենք վիրտուալ կազմակերպչական ցանց 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-ը, որում կտեղակայվեն վիրտուալ մեքենաները և դրանց կոնֆիգուրացիան:
Վիրտուալ մեքենայի կոնֆիգուրացիա
Եկեք ստեղծենք 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. Ենթակառուցվածքի սկզբնավորում
Մոդուլների և պլագինների սկզբնավորում
Աշխատանքի համար մենք օգտագործում ենք պարզ «ջենթլմենների հավաքածու»՝ Windows 10 ՕՀ-ով նոութբուք և պաշտոնական կայքի բաշխման հավաքածու: terraform.exe init
Հաշվողական և ցանցային ենթակառուցվածքը նկարագրելուց հետո մենք սկսում ենք մեր կոնֆիգուրացիան փորձարկելու պլանավորումը, որտեղ մենք կարող ենք տեսնել, թե ինչ է ստեղծվելու և ինչպես է այն կապվելու միմյանց հետ:
-
Կատարեք հրամանը
- terraform plan -var-file=vcd.tfvars
. -
Մենք ստանում ենք արդյունքը
- Plan: 16 to add, 0 to change, 0 to destroy.
Այսինքն՝ ըստ այս պլանի, կստեղծվի 16 ռեսուրս։ -
Մենք գործարկում ենք պլանը հրամանով
- 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 - վիրտուալ տվյալների կենտրոնի անվանումը:
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