Увод у Терраформ за почетнике – Терраформ Туториал

Питате се, шта је Терраформ? Хајде да сазнамо о томе.

Инфраструктура као код (ИаЦ) је широко распрострањена терминологија међу ДевОпс професионалцима. То је процес управљања и обезбеђивања комплетне ИТ инфраструктуре (садржи и физичке и виртуелне машине) коришћењем машински читљивих датотека дефиниција. То је приступ софтверског инжењеринга операцијама. Помаже у аутоматизацији комплетног центра података коришћењем програмских скрипти.

Са свим функцијама које Инфраструктура као код пружа, она има више изазова:

  • Морате научити да кодирате
  • Не знам утицај промене.
  • Потребно је да вратите промену
  • Не могу пратити промене
  • Не могу аутоматизовати ресурс
  • Више окружења за инфраструктуру

Терраформ је креиран да реши ове изазове.

Шта је Терраформ?

Терраформ је инфраструктура отвореног кода као алат за код који је развио ХасхиЦорп. Користи се за дефинисање и обезбеђивање комплетне инфраструктуре користећи декларативни језик који се лако учи.

То је алат за обезбеђивање инфраструктуре где можете да складиштите подешавања инфраструктуре облака као кодове. Веома је сличан алатима као што су ЦлоудФорматион, који бисте користили да аутоматизујете своју АВС инфраструктуру, али то можете да користите само на АВС-у. Са Терраформом, можете га користити и на другим платформама у облаку.

Испод су неке од предности коришћења Терраформа.

  • Ради оркестрацију, а не само управљање конфигурацијом
  • Подржава више провајдера као што су АВС, Азуре, ГЦП, ДигиталОцеан и многи други
  • Обезбедите непроменљиву инфраструктуру где се конфигурација глатко мења
  • Користи језик који је лако разумљив, ХЦЛ (ХасхиЦорп конфигурациони језик)
  • Лако се преноси на било ког другог провајдера
  • Подржава само клијентску архитектуру, тако да нема потребе за додатним управљањем конфигурацијом на серверу

Терраформ Цоре концепти

Испод су основни концепти/терминологије које се користе у Терраформу:

  • Променљиве: Такође се користе као улазне варијабле, то је пар кључ-вредност који користе Терраформ модули да би омогућили прилагођавање.
  • Провајдер: То је додатак за интеракцију са АПИ-јима услуге и приступ повезаним ресурсима.
  • Модул: То је фасцикла са Терраформ шаблонима где су дефинисане све конфигурације
  • Стање: Састоји се од кешираних информација о инфраструктури којом управља Терраформ и повезаним конфигурацијама.
  • Ресурси: Односи се на блок једног или више инфраструктурних објеката (рачунарских инстанци, виртуелних мрежа, итд.), који се користе за конфигурисање и управљање инфраструктуром.
  • Извор података: Спроводе га провајдери за враћање информација о спољним објектима у терраформ.
  • Излазне вредности: Ово су повратне вредности терраформ модула које могу користити друге конфигурације.
  • План: То је једна од фаза у којој се одређује шта треба креирати, ажурирати или уништити да би се прешло из стварног/тренутног стања инфраструктуре у жељено стање.
  • Примена: То је једна од фаза у којој примењује промене стварног/тренутног стања инфраструктуре како би се прешло у жељено стање.

Терраформ Лифецицле

Животни циклус Терраформа састоји се од – покретања, планирања, примене и уништавања.

  • Терраформ инит иницијализује радни директоријум који се састоји од свих конфигурационих датотека
  • Терраформ план се користи за креирање плана извршења за постизање жељеног стања инфраструктуре. Промене у конфигурационим датотекама се врше како би се постигло жељено стање.
  • Терраформ аппли затим врши промене у инфраструктури како је дефинисано у плану и инфраструктура долази у жељено стање.
  • Уништавање терраформа се користи за брисање свих старих инфраструктурних ресурса, који су означени као заражени након фазе примене.

Како Терраформ функционише?

Терраформ има две главне компоненте које чине његову архитектуру:

Терраформ Цоре

Терраформ језгро користи два улазна извора да обави свој посао.

Први извор улаза је Терраформ конфигурација коју ви, као корисник, конфигуришете. Овде дефинишете шта треба да се креира или обезбеди. А други извор улаза је стање у којем терраформ одржава ажурно стање о томе како изгледа тренутна поставка инфраструктуре.

Дакле, оно што ради језгро терраформа је да узима улаз и смишља план шта треба да се уради. Он пореди стање, какво је тренутно стање и какву конфигурацију желите у крајњем резултату. Он открива шта треба да се уради да би се дошло до жељеног стања у конфигурационој датотеци. Он одређује шта треба да се направи, шта треба да се ажурира, шта треба избрисати да би се створила и обезбедила инфраструктура.

  Поставите одговор ван канцеларије за поруке послате на вашу Фацебоок страницу

Провајдери

Друга компонента архитектуре су добављачи специфичних технологија. То могу бити добављачи облака као што су АВС, Азуре, ГЦП или друга инфраструктура као платформа услуге. Такође је добављач компоненти вишег нивоа као што су Кубернетес или други алати платформа као услуга, чак и неки софтвер као самоуслужни алат.

Даје вам могућност да креирате инфраструктуру на различитим нивоима.

На пример – креирајте АВС инфраструктуру, затим примените Кубернетес на њу, а затим креирајте услуге/компоненте унутар тог Кубернетес кластера.

Терраформ има преко сто провајдера за различите технологије, а сваки провајдер затим даје Терраформ кориснику приступ својим ресурсима. Дакле, преко АВС провајдера, на пример, имате приступ стотинама АВС ресурса као што су ЕЦ2 инстанце, АВС корисници, итд. Са Кубернетес провајдером, имате приступ робама, ресурсима као што су услуге и примене и простори имена, итд.

Дакле, овако функционише Терраформ и на овај начин покушава да вам помогне да обезбедите и покријете комплетно подешавање апликације од инфраструктуре па све до апликације.

Хајде да урадимо неке практичне ствари. 👨‍💻

Инсталираћемо Терраформ на Убунту и обезбедити врло основну инфраструктуру.

Инсталирајте Терраформ

Преузмите најновији терраформ пакет.

Односи се званична страница за преузимање да бисте добили најновију верзију за одговарајући ОС.

[email protected]:~$ wget https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
--2020-08-14 16:55:38--
https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.153.183, 2a04:4e42:24::439
Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.153.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 34851622 (33M) [application/zip]
Saving to: ‘terraform_0.13.0_linux_amd64.zip’

terraform_0.13.0_linux_amd64.zip
100%[=================================================================>] 33.24M
90.3KB/s in 5m 28s

2020-08-14 17:01:06 (104 KB/s) - ‘terraform_0.13.0_linux_amd64.zip’ saved [34851622/34851622]

Распакујте преузети пакет.

[email protected]:~$ unzip terraform_0.13.0_linux_amd64.zip
Archive:
terraform_0.13.0_linux_amd64.zip
inflating: terraform

Померите терраформ извршну датотеку на путању приказану испод. Проверите терраформ верзију.

[email protected]:~$ sudo mv terraform /usr/local/bin/
[sudo] password for techblog.co.rs:
[email protected]:~$ terraform -v
Terraform v0.13.0

Можете видети да су ово доступне команде у терраформи за извршење.

[email protected]:~$ terraform
Usage: terraform [-version] [-help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
apply Builds or changes infrastructure
console Interactive console for Terraform interpolations
destroy Destroy Terraform-managed infrastructure
env Workspace management
fmt Rewrites config files to canonical format
get Download and install modules for the configuration
graph Create a visual graph of Terraform resources
import Import existing infrastructure into Terraform
init Initialize a Terraform working directory
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Read an output from a state file
plan Generate and show an execution plan
providers Prints a tree of the providers used in the configuration
refresh Update local state file against real resources
show Inspect Terraform state or plan
taint Manually mark a resource for recreation
untaint Manually unmark a resource as tainted
validate Validates the Terraform files
version Prints the Terraform version
workspace Workspace management

All other commands:
0.12upgrade Rewrites pre-0.12 module source code for v0.12
0.13upgrade Rewrites pre-0.13 module source code for v0.13
debug Debug output management (experimental)
force-unlock Manually unlock the terraform state
push Obsolete command for Terraform Enterprise legacy (v1)
state Advanced state management

Обезбеђивање АВС ЕЦ2 инстанце користећи Терраформ

У овој демонстрацији, лансираћу нову АВС ЕЦ2 инстанцу користећи Терраформ.

Направите радни директоријум за овај Терраформ демо.

[email protected]:~$ mkdir terraform_demo

Идите у директоријум и креирајте терраформ конфигурациону датотеку у којој ћете дефинисати добављача и ресурсе за покретање АВС ЕЦ2 инстанце.

[email protected]:~$ cd terraform_demo/
[email protected]:~/terraform_demo$ gedit awsec2.tf

provider "aws" {
access_key = "B5KG6Fe5GUKIATUF5UD"
secret_key = "R4gb65y56GBF6765ejYSJA4YtaZ+T6GY7H"
region = "us-west-2"
}

resource "aws_instance" "terraform_demo" {
ami = "ami-0a634ae95e11c6f91"
instance_type = "t2.micro"
}

Напомена: Променио сам приступне и тајне кључеве 😛, треба да користите своје.

Из горе поменуте конфигурације, можете видети да помињем провајдера као што је АВС. Унутар провајдера дајем АВС корисничке акредитиве и регионе у којима се инстанца мора покренути.

  Како спречити да вас Фацебоок прати у Фирефок-у

У ресурсима, дајем АМИ детаље о Убунту-у (ами-0а634ае95е11ц6ф91) и помињем да тип инстанце треба да буде т2.мицро

Можете видети колико је конфигурациони фајл лак и читљив, чак и ако нисте тврдоглави програмер.

терраформ инит

Сада, први корак је иницијализација терраформа.

[email protected]:~/terraform_demo$ terraform init

Initializing the backend...

Initializing provider plugins...
- Using previously-installed hashicorp/aws v3.2.0

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, we recommend adding version constraints in a required_providers block
in your configuration, with the constraint strings suggested below.

* hashicorp/aws: version = "~> 3.2.0"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

тераформни план

Следећа је фаза плана; креираће граф извршења за креирање и обезбеђивање инфраструктуре.

[email protected]:~/terraform_demo$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# aws_instance.terraform_demo will be created
+ resource "aws_instance" "terraform_demo" {
+ ami = "ami-0a634ae95e11c6f91"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
+ primary_network_interface_id = (known after apply)
+ private_dns = (known after apply)
+ private_ip = (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
+ secondary_private_ips = (known after apply)
+ security_groups = (known after apply)
+ source_dest_check = true
+ subnet_id = (known after apply)
+ tenancy = (known after apply)
+ volume_tags = (known after apply)
+ vpc_security_group_ids = (known after apply)

+ ebs_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}

+ ephemeral_block_device {
+ device_name = (known after apply)
+ no_device = (known after apply)
+ virtual_name = (known after apply)
}

+ metadata_options {
+ http_endpoint = (known after apply)
+ http_put_response_hop_limit = (known after apply)
+ http_tokens = (known after apply)
}

+ network_interface {
+ delete_on_termination = (known after apply)
+ device_index = (known after apply)
+ network_interface_id = (known after apply)
}

+ root_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
}

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

терраформ примењују

Фаза примене ће извршити конфигурациону датотеку и покренути АВС ЕЦ2 инстанцу. Када покренете команду примене, питаће вас: „Да ли желите да извршите ове радње?“, потребно је да унесете да и притиснете ентер.

[email protected]:~/terraform_demo$ terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# aws_instance.terraform_demo will be created
+ resource "aws_instance" "terraform_demo" {
+ ami = "ami-0a634ae95e11c6f91"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
+ primary_network_interface_id = (known after apply)
+ private_dns = (known after apply)
+ private_ip = (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
+ secondary_private_ips = (known after apply)
+ security_groups = (known after apply)
+ source_dest_check = true
+ subnet_id = (known after apply)
+ tenancy = (known after apply)
+ volume_tags = (known after apply)
+ vpc_security_group_ids = (known after apply)

+ ebs_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}

+ ephemeral_block_device {
+ device_name = (known after apply)
+ no_device = (known after apply)
+ virtual_name = (known after apply)
}

+ metadata_options {
+ http_endpoint = (known after apply)
+ http_put_response_hop_limit = (known after apply)
+ http_tokens = (known after apply)
}

+ network_interface {
+ delete_on_termination = (known after apply)
+ device_index = (known after apply)
+ network_interface_id = (known after apply)
}

+ root_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
}

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

aws_instance.terraform_demo: Creating...
aws_instance.terraform_demo: Still creating... [10s elapsed]
aws_instance.terraform_demo: Still creating... [20s elapsed]
aws_instance.terraform_demo: Still creating... [30s elapsed]
aws_instance.terraform_demo: Still creating... [40s elapsed]
aws_instance.terraform_demo: Creation complete after 44s [id=i-0eec33286ea4b0740]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Идите на своју АВС ЕЦ2 контролну таблу и видећете да је креирана нова инстанца са ИД-ом инстанце поменутим на крају команде примене.

  Руковање датотекама у ЈаваСцрипт-у

Успешно сте покренули АВС ЕЦ2 инстанцу користећи Терраформ.

терраформ уништити

Коначно, ако желите да избришете инфраструктуру, потребно је да покренете команду уништи.

[email protected]:~/terraform_demo$ terraform destroy
aws_instance.terraform_demo: Refreshing state... [id=i-0eec33286ea4b0740]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy

Terraform will perform the following actions:

# aws_instance.terraform_demo will be destroyed
- resource "aws_instance" "terraform_demo" {
- ami = "ami-0a634ae95e11c6f91" -> null
- arn = "arn:aws:ec2:us-west-2:259212389929:instance/i-0eec33286ea4b0740" -> null
- associate_public_ip_address = true -> null
- availability_zone = "us-west-2c" -> null
- cpu_core_count = 1 -> null
- cpu_threads_per_core = 1 -> null
- disable_api_termination = false -> null
- ebs_optimized = false -> null
- get_password_data = false -> null
- hibernation = false -> null
- id = "i-0eec33286ea4b0740" -> null
- instance_state = "running" -> null
- instance_type = "t2.micro" -> null
- ipv6_address_count = 0 -> null
- ipv6_addresses = [] -> null
- monitoring = false -> null
- primary_network_interface_id = "eni-02a46f2802fd15634" -> null
- private_dns = "ip-172-31-13-160.us-west-2.compute.internal" -> null
- private_ip = "172.31.13.160" -> null
- public_dns = "ec2-34-221-77-94.us-west-2.compute.amazonaws.com" -> null
- public_ip = "34.221.77.94" -> null
- secondary_private_ips = [] -> null
- security_groups = [
- "default",
] -> null
- source_dest_check = true -> null
- subnet_id = "subnet-5551200c" -> null
- tags = {} -> null
- tenancy = "default" -> null
- volume_tags = {} -> null
- vpc_security_group_ids = [
- "sg-b5b480d1",
] -> null

- credit_specification {
- cpu_credits = "standard" -> null
}

- metadata_options {
- http_endpoint = "enabled" -> null
- http_put_response_hop_limit = 1 -> null
- http_tokens = "optional" -> null
}

- root_block_device {
- delete_on_termination = true -> null
- device_name = "/dev/sda1" -> null
- encrypted = false -> null
- iops = 100 -> null
- volume_id = "vol-0be2673afff6b1a86" -> null
- volume_size = 8 -> null
- volume_type = "gp2" -> null
}
}

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

aws_instance.terraform_demo: Destroying... [id=i-0eec33286ea4b0740]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 10s elapsed]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 20s elapsed]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 30s elapsed]
aws_instance.terraform_demo: Destruction complete after 34s

Destroy complete! Resources: 1 destroyed.

Ако поново проверите ЕЦ2 контролну таблу, видећете да је инстанца прекинута.

Закључак

Верујем да вам горе наведено даје идеју да започнете са Терраформом. Само напред и испробајте пример који сам управо показао.

Такође би требало да проверите овај софтвер за аутоматизацију инфраструктуре.

Ако сте заинтересовани да сазнате више, онда бих предложио да проверите Учење ДевОпс-а уз Терраформ курс.