Getting started with Terraform¶
Այս հոդվածում
- Ինչ է ձեզ անհրաժեշտ Terraform-ով աշխատելու համար
- Քայլ 1. Տեղակայել Terraform
- Քայլ 2. Ստեղծել API key
- Քայլ 3. Պատրաստել կոնֆարկացիան
- Քայլ 4. Ինիցիալիզացնել provider-ը
- Քայլ 5. Վավերացնել կոնֆարկացիան
- Քայլ 6. Պատվիրել սերվերը
- Քայլ 7. Փոփոխել կոնֆարկացիան
- Քայլ 8. Ունչնահատուկ ռեսուրսների ոչնչացում (Destroy)
- Գոյություն ունեցող սերվերների ներդրում (Importing)
- Խնդիրների հնարավորությունների լուծում (Troubleshooting)
Տեղեկատվություն
Terraform-ը HashiCorp-ի կողմից մշակված «կոդի միջոցով ենթակառուցվածքների» (infrastructure as code) գործիք է: Ենթակառուցվածքի ցանկալի վիճակը նկարագրված է HCL լեզվով գրված կոնֆարկացիոն ֆայլերում, իսկ Terraform-ը իրական ռեսուրսները համապատասխանեցնում է այդ նկարագրությանը՝ կանչելով սպասարկող կողմի API-ն հատուկ մոդուլի միջոցով, որը հայտնի է որպես provider: Այն իրականացնում է յուրաքանչյուր գործողություն և գրանցում այն state ֆայլում, որպեսզի գործիքը իմանա, թե ինչն արդեն գոյություն ունի, և հաջորդ գործարկման ժամանակ կկիրքնի միայն բացակայող փոփոխությունները: Terraform-ը թույլ է տալիս տեսնել փոփոխությունները նախքան դրանց կիրառումը, պահպանել կոնֆարկացիան տարբերակների կառավարման (version control) մեջ և վերարտադրել նույնական միջավայրեր, ինչը այն դարձնում է սերվերներ, ցանցեր և ծառայություններ կառավարելու հարմարավետ միջոց՝ անկախ դրանց տիրոներից:
Երբ դուք ունեք միայն մեկ սերվեր, այն ձեռքով պատվիրելն ավելի արագ է: Սակայն, երբ դրանք դառնում են տասնհինը, որոնք ստեղծվել են տարբեր ժամանակների վրա տարբեր ադմինիստրատորների կողմից, ոչ ոք չի հիշում, թե ինչու մեկը աշխատում է Ubuntu 20.04-ով, մինչդեռ հարևանը՝ 22.04-ով: Կոնֆարկացիոն ֆայլը պահում է այդ պատմությունը, ինչպես նաև թույլ է տալիս վերականգնել նույն միջավայրը՝ առանց հիշողությունից կլիքերի շղթայական գործողությունները վերարտադրելու:
Մեր provider-ի հետ աշխատանքային գործընթացը հետևյալն է. ֆայլում նշված են նախնական սահմանված (preset) տարբերակը, տեղադիրքը, օպերացիոն համակարգը և տրաֆիկի պլանը, որից հետո terraform apply-ը կատարում է պատվերը և սպասում տեղակայման (deployment) ավտոմատ ավարտին: Կրկնակի գործարկման դեպքում ոչինչ չի կրկնօրինակվում, քանի որ Terraform-ը հիշում է իր ստեղծած ռեսուրսները: terraform plan հրամանը ցույց է տալիս առաջիկա փոփոխությունները՝ առանց դրանցից որևէ մեկը իրականացնելու:
Provider-ը աշխատում է ամբողջ կատալոգի հետ, ներառյալ VPS, VDS, dedicated և GPU սերվերները, հավելավարձը IP հասցեները, SSH բանալիները և DNS գոտիները: Ռեսուրսների և տվյալների աղբյուրների (data sources) ամբողջական ուղեցույցը հասանելի է Terraform Registry հարթակում և hostkey-cloud/terraform-provider-hostkey-com պահոստոցում (repository): Ստորև ներկայացված է հիմնական սցենարը՝ վիրտուալ սերվերի պատվիրումը:
Ինչ է ձեզ անհրաժեշտ Terraform-ով աշխատելու համար¶
- Հաշիվ Invapi կառավարման վահանակում (control panel)՝ հաշվեկշռում առկա միջոցներով, քանի որ սերվերի պատվիրումը վճարովի գործողություն է.
- API key;
- SSH key;
- Terraform 1.0 կամ ավելի նոր տարբերակ:
Զգուշացում
Հաշվի վրա պետք է լինի առน้อยնը մեկ սերվեր: Invapi-ն սեսսիա չի տրամադրում այն հաշվին, որն ունի զրոյական ծառայություններ, և ավտենտիֆիկացիան ձախողվում է No appropriate servers found սխալով: Եթե հաշիվը նոր է, նախ պատվիրեք առաջին սերվերը կառավարման վահանակի միջոցով, իսկ մնացածը ստեղծեք Terraform-ի միջոցով:
Քայլ 1. Տեղակայել Terraform¶
Terraform-ը աշխատում է Linux, macOS և Windows համակարգերում: Դուք կարող եք այն տեղակայել երկու եղանակով՝ կա՛մ փաթեթների կառավարիչի (package manager) միջոցով, կա՛մ ձեռքով՝ ներբեռնելով և քվլելով պատրաստի binary ֆայլը:
Windows¶
Ներբեռնեք արխիվը, քվլեք terraform.exe-ն հատուկ թղթապանակում, օրինակ՝ C:\terraform, և այդ թղթապանակը ավելացրեք Path շրջակա միջավայրի փոփոխականում:
Դրանից հետո փակեք և նորից բացեք տերմինալը, քանի որ նոր Path արժեքը չի կիրառվի մինչև այդ պահը: Տեղակայումը ստուգելու համար գրեք.
Linux¶
wget https://releases.hashicorp.com/terraform/1.15.8/terraform_1.15.8_linux_amd64.zip
unzip ./terraform_1.15.8_linux_amd64.zip
sudo mv ./terraform /usr/local/bin
terraform -v
macOS¶
Քայլ 2. Ստեղծել API key¶
Key-ը ստեղծվում է Invapi կառավարման վահանակում: Սեղմեք ձեր օգտանվան վերևի աջ անկյունում և ընտրեք API keys:

Click Add new և լրացրեք ձևաթուղթը:

| Field | Value |
|---|---|
| Name | 5-30 լատինական տառեր, թվեր, միայն _ և - |
| Restrict a new API key only for the server | Any |
| IP ACL | Leave empty to allow access from any address |
| Set login notification method | None |
| Active | Selected |
Restrict a new API key only for the server դաշտը կապում է բանալին մեկ ծառայության հետ, իսկ provider-ը պետք է կարողանա պատվիրել նոր սերվերներ, ուստի արժեքը պետք է լինի Any:
IP ACL դաշտը սահմանափակում է մուտքը նշված հասցեների համար: Այն բարձրացնում է անվտանգությունը, սակայն դինամիկ IP հասցեի դեպքում բանալին դադարում է աշխատել հենց հասցեն փոփոխվելուց հետո, ուստի սկզբնական փուլում թողեք դաշտը դատարկ, իսկ continuous integration-ի համար նշեք ձեր build սերվերների հասցեները:
Click Create: Բանալին ցուցադրվում է միայն մեկ անգամ:

Զգուշացում
Անմիջապես պահպանեք բանալին, քանի որ մենք պահում ենք միայն դրա հեշը (hash), և արժեքը հնարավոր չէ վերականգնել: Եթե կորցնեք այն, պետք է ստեղծեք նորը:
Քայլ 3. Պատրաստել կոնֆարկացիան¶
Կոնֆարկացիայի օրինակներ
Պատրաստի կոնֆարկացիոն օրինակները հասանելի են provider-ի պահոստոցում: Հիմնական կարգավորման համար տեսեք examples/basic օրինակը:
Ստեղծեք նախագծի թղթապանակ, օրինակ՝ hostkey-terraform: Կոնֆարկացիոն ֆայլերը օգտագործում են .tf ընդլայնումը, և դրանց անունները ցանկացած կարող են լինել, քանի որ Terraform-ը թղթապանակի ներսում գտնվող յուրաքանչյուր .tf ֆայլ միավորում է մեկ միասնական կոնֆարկացիայի մեջ: Մեր օրինակում օգտագործվում է երեք ֆայլ:
main.tf¶
Առաջին բլոկը սահմանում է provider-ը և Terraform-ի պահանջվող տարբերակը:
terraform {
required_providers {
hostkey = {
source = "hostkey-cloud/hostkey-com"
version = "~> 0.2"
}
}
required_version = ">= 1.0"
}
provider "hostkey" {}
Նշում
0.2 տարբերակից սկսած՝ provider-ը հրկնվում է առանձին յուրաքանչյուր հաշվարկման (billing) համակարգի համար: hostkey-com փաթեթը աշխատում է invapi.hostkey.com-ի հետ, ուստի API endpoint ընտրելու կարիք չկա, և provider բլոկը մնում է դատարկ:
Հաջորդը կատալոգի ստուգումն է: Այս բլոկները ռեսուրսներ չեն ստեղծում և չեն հաշվարկվում, դրանք միայն API-ից հարցում են անում՝ ստանալու պատվերի համար հասանելի preset-ների և տրաֆիկի պլանների ցանկերը.
data "hostkey_presets" "selected" {
location = var.location
name = var.preset_name
}
data "hostkey_traffic_plans" "for_preset" {
location = var.location
instance_id = data.hostkey_presets.selected.presets[0].id
}
output "catalog_preset" {
value = data.hostkey_presets.selected.presets
}
output "catalog_traffic_plans" {
value = data.hostkey_traffic_plans.for_preset.traffic_plans
}
Ստուգումը պետք է կատարվի երկու պատճառով: Provider-ը պահանջում է անունների ճիշտ համընկնում, իսկ կատալոգում կան նմանատիպ տրաֆիկ պլանների անուններ, օրինակ՝ 3 TB / 1 Gbps VM և 3Tb traffic (1Gbps) VM: Բացի այդ, կատալոգի բովանդակությունը կախված է տեղակայումից և փոփոփոխվում է ժամանակի ընթացքում, ուստի այսօր հասանելի preset-ը վաղը կարող է չլինել հասանելի:
Հաջորդը սերվերի նկարագրությունն է.
resource "hostkey_server" "web" {
preset_name = var.preset_name
location_name = var.location
traffic_plan_name = var.traffic_plan_name
deploy_period = "monthly"
os_name = "Ubuntu 22.04"
root_pass = var.root_pass
ssh_key = file(pathexpand(var.ssh_public_key_path))
power_state = "on"
cancellation_type = 1
cancellation_reason = "terraform"
tags = {
env = "demo"
}
timeouts {
create = "90m"
update = "90m"
delete = "30m"
}
}
timeouts բլոկը սահմանում է, թե որքան ժամանակ Terraform-ը պետք է սպասի գործողության ավարտին: Տեղակայումը սովորաբար տևում է մի քանի րոպե, սակայն, եթե սպասումը կտրվում է timeout-ի պատճառով, պատվերը մնում է վճարված, մինչդեռ Terraform-ը կորցնում է դրա վերահսկողությունը:
cancellation_type արգումենտը, սահմանված 1 արժեքով, անմիջապես չեղարկում է ծառայությունը, մինչդեռ 0-ը թողնում է այն աշխատել վճարված ժամանակաշրջանի ավարտին:
Նշում
hostname արգումենտը միտվածաբար բացակայում է օրինակում: Երբ այն բացակայում է, provider-ը գեներացնում է եզակի անուն, օրինակ՝ tf-44067425, և ծառայությունը կառավարման վահանակում հայտնվում է այդ անվամբ: Օպերացիոն համակարգի ներսում անունը կարող է տարբերվել, քանի որ Invapi-ն այն չի փոխանցում հյուրընկալ համակարգին, ուստի միակ տարբերակը ստուգելն է hostname հրամանով հենց սերվերի վրա:
Հաշվի պահոցում SSH բանալին ստեղծվում է առանձին.
resource "hostkey_ssh_key" "deploy" {
name = "tf-deploy"
key = file(pathexpand(var.ssh_public_key_path))
}
Սա նույնն է, ինչ hostkey_server-ի ssh_key ատրիբուտը: Սերվերի ատրիբուտը բանալին գրում է մեքենայի վրա օպերացիոն համակարգի տեղակայման ժամանակ, մինչդեռ hostkey_ssh_key ռեսուրսը պահում է բանալին հաշվի մեջ հետագա օգտագործման համար:
Ֆայլն ավարտվում է output բլոկերով: Պատվերից հետո Terraform-ը տպում է սերվերի հասցեն, նրա իդենտիֆիկատորը և հաշիվի համարը, իսկ terraform output main_ipv4 հրամանը ցույց է տալիս հասցեն ցանկացուց հետո, ինչը շատ հարմար է հաջորդ գործողությունների համար:
output "server_id" {
value = hostkey_server.web.id
}
output "main_ipv4" {
value = hostkey_server.web.main_ipv4
}
output "invoice" {
value = hostkey_server.web.invoice
}
variables.tf¶
variable "location" {
type = string
default = "FI"
}
variable "preset_name" {
type = string
default = "vm.v2-pico"
}
variable "traffic_plan_name" {
type = string
default = "3 TB / 1 Gbps VM"
}
variable "root_pass" {
type = string
sensitive = true
}
variable "ssh_public_key_path" {
type = string
default = "~/.ssh/id_ed25519.pub"
}
terraform.tfvars¶
Այս ֆայլը պահում է գաղտնաբառը, ուստի այն չի ներառվում version control-ում.
root_pass = "StrongPass1%"
# Defaults-ը կարող է փոփոխվել այստեղ
# location = "NL"
# preset_name = "vm.v3-pico"
# traffic_plan_name = "5 TB / 1 Gbps VM"
Զգուշացում
Root գաղտնաբառը պետք է լինի 8-ից 30 նիշ երկարությամբ և պարունակի մեծատառ, փոքրատառ, թիվ և %, -, _, + նշաններից մեկը: @ և # նշանները թույլատրված չեն: Գաղտնաբառը պահվում է Terraform-ի state ֆայլում և ուղարկվում է սերվերի պատրաստ լինելու մասին էլեկտրոնային նամակի մեջ՝ պարզ տեքստով, ուստի փոփոխեք այն, երբ սերվերը տեղակայված կլինի:
Քայլ 4. Ինիցիալիզացնել provider-ը¶
Բանալին փոխանցվում է որպես շրջակա միջավայրի փոփոխական, որպեսզի այն չհայտնվի նախագծի ֆայլերում.
Windows-ի command prompt-ում օգտագործեք set HOSTKEY_API_KEY=your-key, իսկ Linux-ում և macOS-ում՝ export HOSTKEY_API_KEY="your-key": Փոփոխականը գործում է միայն տվյալ տերմինալի սեսիայի համար:
Նշում
Բանալին անհրաժեշտ է արդեն պլանավորման փուլում, քանի որ provider-ը համադրում է կոնֆարկացիայում նշված անունները կատալոգի հետ, և առանց API հասանելիության գործընթացը ձախողվում է:
Հաջորդիվ պետք է ներբեռնվի provider-ը.

Terraform-ը ներբեռնում է provider-ը և ստեղծում .terraform.lock.hcl ֆայլ՝ հստակ տարբերակով: Այս ֆայլը ներառվում է պահոստոցում (repository), քանի որ այն երաշխավորում է, որ նախագծի բոլոր մասնակիցները կունենան նույն տեղակայված տարբերակը:
Քայլ 5. Վավերացնել կոնֆարկացիան¶
Սինտաքսը ստուգվում է առանց API կանչի.
Հաջողված ստուգումը տպում է Success! The configuration is valid.:
Այնուհետև գալիս է plan-ը, որը ցույց է տալիս առաջիկա փոփոխությունները՝ առանց դրանցից որևէ մեկը իրականացնելու.
Summary line. Ակնկալեք Plan: 2 to add, 0 to change, 0 to destroy, այսինքն՝ սերվեր և SSH բանալի:
Resolved identifiers. Provider-ը անունների կողքին լրացնում է preset_id, os_id և traffic_plan_id արժեքները, և եթե անունը չի գտնվում կատալոգում, plan-ը ձախողվում է նախքան որևէ վճարման իրականացումը:
Catalog. Changes to Outputs բաժինը թվարկում է preset-ները և տրաֆիկ պլանները, և կոնֆարկացիայում նշված արժեքները պետք է գրված լինեն հենց այդպես:
Քայլ 6. Պատվիրել սերվերը¶
Terraform-ը ևս մեկ անգամ ցույց է տալիս plan-ը և հարցնում է հաստատում. գրեք yes և սեղմեք Enter:

Զգուշացում
Այս պահից սկսած պատվերը վճարվող է: Մի՛ փակեք տերմինալի պատու窗口ը և մի՛ ընդհատեք հրամանը, հակառակ դեպքում պատվերը կմնա կառավարման վահանակում, մինչդեռ Terraform-ը կկորցի դրա վերահսկողությունը:
Նախ ստեղծվում է SSH բանալին, այնուհետև սկսվում է սերվերի պատվիրումը, և Terraform-ը ինքնուրույն հաշվարկում է հերթականությունը՝ հիմնվելով կախվածություններ վրա:

Դրանից հետո հայտնվում են Still creating... տողերը, որոնք թարմացվում են յուրաքանչյուր տասը վայրկյանը մեկ, մինչդեռ provider-ը հարցումներ է ուղարկում API-ին և սպասում տեղակայման ավարտին: Միդերկում սերվերը տեսանելի է կառավարման վահանակում.

Երբ ամեն ինչ պատրաստ է, արժեքները տպվում են: Արժե է ստուգել SSH հասանելիությունը ձեր ստացած հասցեով.

ssh_key ատրիբուտում նշված բանալին արդեն առկա է սերվերի վրա, ուստի գաղտնաբառ չի պահանջվում: Նոր սերվերը կառավարման վահանակում հայտնվում է ձեռքով պատվիրված սերվերների կողքին.

Քայլ 7. Փոփոխել կոնֆարկացիան¶
Փոփոխությունները բաժանվում են երեք կատեգորիայի.
-
Safe changes. Թեգերը և էներգետիկ վիճակը (power state) կիրառվում են աշխատող սերվերի վրա, և plan-ը դրանք ցույց է տալիս որպես
update in-place: -
Operating system reinstall.
os_name,soft_name,root_passկամssh_keyփոփոխելը նշանակում է օպերացիոն համակարգի վերատեղակայում նույն սերվերի վրա, ինչը նշանակում է, որ սկավառակի վրա եղած բոլոր տվյալները կկորցվեն: -
A new order.
preset_name,location_name,traffic_plan_nameկամdeploy_periodփոփոխելը նշանակում է, որ նախորդ սերվերը չեղարկվում է և պատվիրվում է նորը, ինչի հետևանքով ձեզնից նորին վճար կպահվի: Plan-ը նման փոփոխությունները նշում է որպեսforces replacement:
Զգուշացում
Վերատեղակայմանը հանգեցնող փոփոխությունները plan-ում հայտնվում են որպես update in-place, ճիշտ այնպես, ինչպես անվնաս թեգի փոփոխությունը: Provider-ը առձին զգուշացում է տպում տվյալների կորստի մասին, ուստի նախքան հաստատումը արժե կարդալ ոչ միայն plan-ը, այլև զգուշացումները:
Քայլ 8. Ունչնահատուկ ռեսուրսների ոչնչացում (Destroy)¶
terraform destroy-ն հեռացնում է բոլոր այն ռեսուրսները, որոնք ներկայումս գտնվում են տվյալ կոնֆարկացիայի Terraform state-ում: Terraform-ը կցուցադրի հեռացվող ռեսուրսների ցանկը և հարց կտա հաստատման համար: Մուտքագրեք yes և սեղմեք Enter:
Եթե ցանկանում եք հեռացնել միայն մեկ ռեսուրս, կարող եք նշել այն -target պարամետրով: Օրինակ՝
Այստեղ web-ը resource "hostkey_server" "web" բլոկի ռեսուրսի անունն է, այլ ոչ թե սերվերի ID-ն կառավարման վահանակում:
Մեկ այլ տարբերակ՝ ռեսոուրսը հեռացնելն է .tf ֆայլերից և հետո գործարկել՝
Terraform-ը կտեսնի, որ ռեսուրսը այլևս առկա չէ կոնֆարկացիայում, և կհեռացնի այն ենթակառուցվածքից:
Ծառայության չեղարկումը կատարվում է Invapi-ի միջոցով, և չեղարկման մեթոդը որոշվում է cancellation_type պարամետրով. 1-ը չեղարկում է ծառայությունը անմիջապես, իսկ 0-ը՝ վճարված ժամանակաշրջանի ավարտին:
Տեղեկատվություն
Անմիջապես չեղարկման դեպքում (cancellation_type = 1), վճարված ժամանակաշրջանի չօգտագործված մասը վերադարձվում է հաշվի հաշվեկշռին՝ համամասնաբար ծառայության իրական աշխատանքային ժամանակին:
Գոյություն ունեցող սերվերների ներդրում (Importing)¶
Կառավարման վահանակի միջոցով պատվիրված սերվերները կարող են դառնալ Terraform-ի կառավարման ներքև: Իդենտիֆիկատորը վերցվում է սերվերների ցանկի ID սյունակից.
Ներդրումից հետո state-ը պահում է իրական տվյալները, այսինքն՝ իդենտիֆիկատորը, հասցեն, կարգավիճակը և էներգետիկ վիճակը: Պատվերի ժամանակ ստացված արգումենտները չեն փոխանցվում կառավարման վահանակից, ուստի դրանք պետք է ձեռքով նկարագրվեն կոնֆարկացիայում: Ներդրումից հետո առաջին terraform apply-ը չի հանգեցնում վերատեղակայման:
Խնդիրների հնարավորությունների լուծում (Troubleshooting)¶
Նշում
No appropriate servers found plan-ը գործարկելիս: Ստուգեք, որ հաշվի վրա առնվազն մեկ ծառայություն կա, քանի որ Invapi-ն սեսսիա չի տրամադրում այն հաշվին, որն ունի զրոյական ծառայություններ:
Նշում
Catalog name resolve failed: Նշված preset-ը, օպերացիոն համակարգը կամ տրաֆիկ պլանի անունը առկա չէ ընտրված տեղակայքի կատալոգում: Ցանկացած հասանելի արժեք ստուգեք hostkey_presets և hostkey_traffic_plans աղբյուրների միջոցով և համապատասխանեցրեք կոնֆարկացիան դրանց:
Նշում
State pending:<invoice>: Պատվերը վճարված է, բայց տեղակայումը չի ավարտվել, որպես կանոն՝ կապի ընդհատման պատճառով: terraform apply-ի կրկնակի գործարկումը շարունակում է սպասումը և նոր պատվեր չի կատարում: Եթե հաշիվը չի վճարված, վճարեք և նորից գործարկեք terraform apply: Ծառայության իրական կարգավիճակը տեսանելի է կառավարման վահանակում:
Տեղեկատվություն
Terraform-ի մասին ավելի շատ տեղեկություն կարող եք գտնել HashiCorp-ի պաշտոնական փաստաթղթերում, իսկ ռեսուրսների և տվյալների աղբյուրների կոնկրետ արգումենտները փաստաթղթավորված են Terraform Registry հարթակում: