Въведение в Terraform за начинаещи – Урок за Terraform

Чудите се какво е Terraform? Нека разберем за това.

Инфраструктурата като код (IaC) е широко разпространена терминология сред специалистите по DevOps. Това е процес на управление и осигуряване на пълната ИТ инфраструктура (включваща както физически, така и виртуални машини) с помощта на машинночетими дефиниционни файлове. Това е подход на софтуерно инженерство към операциите. Помага при автоматизирането на целия център за данни чрез използване на програмни скриптове.

С всички функции, които Infrastructure as Code предоставя, тя има множество предизвикателства:

  • Трябва да се научите да кодирате
  • Не знам въздействието на промяната.
  • Трябва да върнете промяната
  • Не могат да се проследят промените
  • Не може да се автоматизира ресурс
  • Множество среди за инфраструктура

Terraform е създаден, за да разреши тези предизвикателства.

Какво е Terraform?

Тераформа е инфраструктура с отворен код като инструмент за код, разработен от HashiCorp. Използва се за дефиниране и осигуряване на пълната инфраструктура с помощта на лесен за научаване декларативен език.

Това е инструмент за осигуряване на инфраструктура, където можете да съхранявате настройките на вашата облачна инфраструктура като кодове. Той е много подобен на инструменти като CloudFormation, който бихте използвали за автоматизиране на вашата AWS инфраструктура, но можете да го използвате само на AWS. С Terraform можете да го използвате и на други облачни платформи.

По-долу са някои от предимствата на използването на Terraform.

  • Прави оркестрация, а не само управление на конфигурацията
  • Поддържа множество доставчици като AWS, Azure, GCP, DigitalOcean и много други
  • Осигурете неизменна инфраструктура, където конфигурацията се променя плавно
  • Използва лесен за разбиране език, HCL (конфигурационен език на HashiCorp)
  • Лесно преносим към всеки друг доставчик
  • Поддържа клиентска архитектура, така че няма нужда от допълнително управление на конфигурацията на сървър

Основни концепции на Terraform

По-долу са основните понятия/терминологии, използвани в Terraform:

  • Променливи: Използва се също като входни променливи, това е двойка ключ-стойност, използвана от модулите Terraform, за да позволи персонализиране.
  • Доставчик: Това е плъгин за взаимодействие с API на услугата и достъп до свързаните с нея ресурси.
  • Модул: Това е папка с шаблони на Terraform, където са дефинирани всички конфигурации
  • Състояние: Състои се от кеширана информация за инфраструктурата, управлявана от Terraform и свързаните конфигурации.
  • Ресурси: Отнася се за блок от един или повече инфраструктурни обекти (изчислителни инстанции, виртуални мрежи и т.н.), които се използват при конфигуриране и управление на инфраструктурата.
  • Източник на данни: Внедрява се от доставчици за връщане на информация за външни обекти за тераформиране.
  • Изходни стойности: Това са върнати стойности на тераформен модул, които могат да се използват от други конфигурации.
  • План: Това е един от етапите, където се определя какво трябва да бъде създадено, актуализирано или унищожено, за да се премине от реално/текущо състояние на инфраструктурата към желаното състояние.
  • Прилагане: Това е един от етапите, в които се прилагат промените в реалното/текущото състояние на инфраструктурата, за да се премине към желаното състояние.

Жизнен цикъл на Terraform

Жизненият цикъл на Terraform се състои от – стартиране, планиране, прилагане и унищожаване.

  • Terraform init инициализира работната директория, която се състои от всички конфигурационни файлове
  • Планът Terraform се използва за създаване на план за изпълнение за достигане на желано състояние на инфраструктурата. Промените в конфигурационните файлове се правят, за да се постигне желаното състояние.
  • След това прилагането на Terraform прави промените в инфраструктурата, както е определено в плана, и инфраструктурата идва в желаното състояние.
  • Унищожаването на Terraform се използва за изтриване на всички стари инфраструктурни ресурси, които са маркирани като опетнени след фазата на прилагане.

Как работи Terraform?

Terraform има два основни компонента, които изграждат нейната архитектура:

Terraform Core

Terraform core използва два входни източника, за да върши работата си.

Първият входен източник е конфигурация на Terraform, която вие, като потребител, конфигурирате. Тук вие определяте какво трябва да се създаде или предостави. И вторият входен източник е състояние, при което terraform поддържа актуалното състояние на това как изглежда текущата настройка на инфраструктурата.

  Какво е мрежов анализатор и за какво се използва?

И така, това, което terraform core прави, е, че приема входните данни и определя плана за това какво трябва да се направи. Той сравнява състоянието, какво е текущото състояние и каква е конфигурацията, която желаете в крайния резултат. Той открива какво трябва да се направи, за да се стигне до желаното състояние в конфигурационния файл. Той определя какво трябва да се създаде, какво трябва да се актуализира, какво трябва да се изтрие, за да се създаде и осигури инфраструктурата.

Доставчици

Вторият компонент на архитектурата са доставчици за специфични технологии. Това може да са облачни доставчици като AWS, Azure, GCP или друга инфраструктура като платформа за услуги. Освен това е доставчик на компоненти от по-високо ниво като Kubernetes или други инструменти за платформа като услуга, дори някои софтуери като инструменти за самообслужване.

Дава ви възможност да създавате инфраструктура на различни нива.

Например – създайте AWS инфраструктура, след това внедрите Kubernetes върху нея и след това създайте услуги/компоненти вътре в този Kubernetes клъстер.

Terraform има над сто доставчици за различни технологии и всеки доставчик след това дава достъп на потребителите на terraform до своите ресурси. Така чрез доставчика на AWS например имате достъп до стотици ресурси на AWS като EC2 инстанции, потребителите на AWS и т.н. С доставчика на Kubernetes имате достъп до стоки, ресурси като услуги и внедрявания и пространства от имена и т.н.

Ето как работи Terraform и по този начин се опитва да ви помогне да осигурите и покриете пълната настройка на приложението от инфраструктурата до приложението.

Нека направим някои практични неща. 👨‍💻

Ще инсталираме Terraform на Ubuntu и ще предоставим много базова инфраструктура.

Инсталирайте Terraform

Изтеглете най-новия пакет terraform.

Обърнете се към официална страница за изтегляне за да получите най-новата версия за съответната ОС.

[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

Преместете изпълнимия файл на terraform на пътя, показан по-долу. Проверете версията на тераформата.

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

Можете да видите, че това са наличните команди в terraform за изпълнение.

[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

Предоставяне на екземпляр на AWS EC2 с помощта на Terraform

В тази демонстрация ще стартирам нов екземпляр на AWS EC2 с помощта на Terraform.

Създайте работна директория за тази демонстрация на Terraform.

[email protected]:~$ mkdir terraform_demo

Отидете в директорията и създайте конфигурационен файл на terraform, където дефинирате доставчика и ресурсите за стартиране на екземпляр на AWS EC2.

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

Забележка: Промених ключовете за достъп и секретния ключ 😛, трябва да използвате свой собствен.

  Как да напишете основна програма на Apple II във вашия уеб браузър

От конфигурацията, спомената по-горе, можете да видите, че споменавам доставчика като AWS. Вътре в доставчика давам потребителски идентификационни данни на AWS и региони, където екземплярът трябва да бъде стартиран.

В ресурсите давам AMI подробности за Ubuntu (ami-0a634ae95e11c6f91) и споменавам, че типът на екземпляра трябва да бъде t2.micro

Можете да видите колко лесен и четим е конфигурационният файл, дори и да не сте заклет кодер.

terraform init

Сега, първата стъпка е да инициализирате terraform.

[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.

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

Етапът на прилагане ще изпълни конфигурационния файл и ще стартира екземпляр на AWS EC2. Когато стартирате командата apply, тя ще ви попита „Искате ли да извършите тези действия?“, трябва да въведете yes и да натиснете enter.

[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.

Отидете на вашето табло за управление на AWS EC2 и ще видите, че е създаден нов екземпляр с идентификатора на екземпляра, споменат в края на командата за прилагане.

  Как да деактивирате разделен екран в Safari

Успешно стартирахте екземпляр на AWS EC2 с помощта на Terraform.

terraform унищожи

И накрая, ако искате да изтриете инфраструктурата, трябва да изпълните командата destroy.

[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.

Ако проверите отново таблото за управление на EC2, ще видите, че инстанцията е прекратена.

Заключение

Вярвам, че горното ви дава идея как да започнете с Terraform. Продължете и изпробвайте примера, който току-що показах.

Трябва също да проверите този софтуер за автоматизация на инфраструктурата.

Ако се интересувате да научите повече, предлагам да проверите Изучаване на DevOps с курс Terraform.