Вступ до Terraform для початківців – підручник Terraform

| | 0 Comments| 7:07 AM
Categories:

Цікаво, що таке Terraform? Давайте дізнаємось про це.

Інфраструктура як код (IaC) — широко поширена термінологія серед професіоналів DevOps. Це процес керування та надання повної ІТ-інфраструктури (включає фізичні та віртуальні машини) за допомогою машинозчитуваних файлів визначень. Це підхід розробки програмного забезпечення до операцій. Це допомагає автоматизувати весь центр обробки даних за допомогою сценаріїв програмування.

З усіма функціями, які надає інфраструктура як код, вона має кілька проблем:

  • Потрібно навчитися кодувати
  • Не знаю впливу змін.
  • Потрібно скасувати зміни
  • Неможливо відстежити зміни
  • Неможливо автоматизувати ресурс
  • Кілька середовищ для інфраструктури

Terraform був створений для вирішення цих проблем.

Що таке Terraform?

Тераформа це інфраструктура з відкритим вихідним кодом як інструмент коду, розроблений HashiCorp. Він використовується для визначення та надання повної інфраструктури за допомогою легкої для вивчення декларативної мови.

Це інструмент ініціалізації інфраструктури, де ви можете зберігати свої налаштування хмарної інфраструктури у вигляді кодів. Це дуже схоже на такі інструменти, як CloudFormation, який ви використовували б для автоматизації вашої інфраструктури AWS, але ви можете використовувати його лише на AWS. За допомогою Terraform ви також можете використовувати його на інших хмарних платформах.

Нижче наведено деякі з переваг використання Terraform.

  • Здійснює оркестровку, а не лише керування конфігурацією
  • Підтримує кілька постачальників, таких як AWS, Azure, GCP, DigitalOcean та багато інших
  • Забезпечте незмінну інфраструктуру, де конфігурація змінюється плавно
  • Використовує зрозумілу мову, HCL (мова конфігурації HashiCorp)
  • Легко переноситься на будь-якого іншого постачальника
  • Підтримує лише клієнтську архітектуру, тому немає потреби в додатковому управлінні конфігурацією на сервері

Основні концепції Terraform

Нижче наведено основні поняття/терміни, які використовуються в Terraform:

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

Життєвий цикл Terraform

Життєвий цикл Terraform складається з ініціалізації, планування, застосування та знищення.

  • Terraform init ініціалізує робочий каталог, який складається з усіх конфігураційних файлів
  • План Terraform використовується для створення плану виконання для досягнення бажаного стану інфраструктури. Зміни в конфігураційних файлах вносяться для досягнення бажаного стану.
  • Після цього застосування Terraform вносить зміни в інфраструктуру, як визначено в плані, і інфраструктура приходить у потрібний стан.
  • Знищення Terraform використовується для видалення всіх старих інфраструктурних ресурсів, які позначені як зіпсовані після фази застосування.

Як працює Terraform?

Terraform має два основних компоненти, які складають його архітектуру:

Terraform Core

Terraform core використовує два джерела вхідних даних для виконання своєї роботи.

Першим джерелом вхідних даних є конфігурація Terraform, яку ви налаштовуєте як користувач. Тут ви визначаєте, що потрібно створити або надати. І друге джерело вхідних даних — це стан, у якому terraform зберігає актуальну інформацію про те, як виглядає поточна настройка інфраструктури.

Отже, terraform core приймає вхідні дані та визначає план того, що потрібно зробити. Він порівнює стан, поточний стан і конфігурацію, яку ви бажаєте отримати в кінцевому результаті. Він визначає, що потрібно зробити, щоб отримати бажаний стан у файлі конфігурації. Він визначає, що потрібно створити, що потрібно оновити, що потрібно видалити, щоб створити та забезпечити інфраструктуру.

  Що таке зворотне тунелювання SSH? (і як ним користуватися)

Провайдери

Другим компонентом архітектури є провайдери для конкретних технологій. Це можуть бути хмарні провайдери, такі як 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 за вказаним нижче шляхом. Перевірте версію terraform.

[email protected]:~$ sudo mv terraform /usr/local/bin/
[sudo] password for techukraine.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"
}

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

З наведеної вище конфігурації ви бачите, що я згадую провайдера, наприклад AWS. Усередині постачальника я надаю облікові дані користувача AWS і регіони, де має бути запущений екземпляр.

У ресурсах я надаю AMI деталі Ubuntu (ami-0a634ae95e11c6f91) і згадую, що тип екземпляра має бути t2.micro

  Виправлено, що контролер PS4 блимає білим

Ви можете побачити, наскільки легким і читабельним є файл конфігурації, навіть якщо ви не затятий програміст.

terraform ініц

Тепер першим кроком є ​​ініціалізація 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.

terraform застосовувати

На етапі застосування буде виконано файл конфігурації та запущено екземпляр AWS EC2. Коли ви запускаєте команду apply, вона запитає вас: «Ви хочете виконати ці дії?», вам потрібно ввести так і натиснути 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, і ви побачите, що створено новий екземпляр із ідентифікатором екземпляра, зазначеним у кінці команди застосування.

  Як безкоштовно отримати Microsoft Office

Ви успішно запустили екземпляр AWS EC2 за допомогою Terraform.

terraform знищити

Нарешті, якщо ви хочете видалити інфраструктуру, вам потрібно виконати команду знищення.

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