Введение в Terraform для начинающих — Учебное пособие по Terraform

Хотите знать, что такое Terraform? Давайте узнаем об этом.

Термин «инфраструктура как код» (IaC) широко распространен среди профессионалов DevOps. Это процесс управления и подготовки всей ИТ-инфраструктуры (включающей как физические, так и виртуальные машины) с использованием машиночитаемых файлов определений. Это программный инженерный подход к операциям. Это помогает в автоматизации всего центра обработки данных с помощью сценариев программирования.

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

  • Нужно научиться кодить
  • Не знаю, как повлияют изменения.
  • Нужно отменить изменение
  • Не могу отслеживать изменения
  • Не могу автоматизировать ресурс
  • Несколько сред для инфраструктуры

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 apply вносит изменения в инфраструктуру в соответствии с планом, и инфраструктура приходит в желаемое состояние.
  • Terraform destroy используется для удаления всех старых ресурсов инфраструктуры, которые помечаются как испорченные после этапа применения.

Как работает Терраформ?

Архитектура Terraform состоит из двух основных компонентов:

Терраформ Ядро

Ядро Terraform использует два источника ввода для выполнения своей работы.

Первый источник входных данных — это конфигурация Terraform, которую вы, как пользователь, настраиваете. Здесь вы определяете, что необходимо создать или подготовить. И второй источник ввода — это состояние, в котором terraform сохраняет актуальное состояние того, как выглядит текущая настройка инфраструктуры.

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

Провайдеры

Вторым компонентом архитектуры являются поставщики конкретных технологий. Это могут быть облачные провайдеры, такие как AWS, Azure, GCP или другая инфраструктура в качестве сервисной платформы. Он также является поставщиком более высокоуровневых компонентов, таких как Kubernetes или других инструментов «платформа как услуга», и даже некоторого программного обеспечения в качестве инструмента самообслуживания.

Это дает вам возможность создавать инфраструктуру на разных уровнях.

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

Terraform имеет более сотни провайдеров для различных технологий, и каждый провайдер предоставляет пользователю terraform доступ к своим ресурсам. Таким образом, через провайдера AWS, например, у вас есть доступ к сотням ресурсов AWS, таких как экземпляры EC2, пользователи AWS и т. д. С провайдером Kubernetes вы получаете доступ к товарам, ресурсам, таким как сервисы, развертывания, пространства имен и т. д.

Итак, вот как работает Terraform, и таким образом он пытается помочь вам подготовить и охватить полную настройку приложения от инфраструктуры до самого приложения.

Давайте займемся практическими делами. 👨‍💻

Мы установим Terraform на Ubuntu и предоставим очень простую инфраструктуру.

Установить Терраформ

Загрузите последний пакет 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 toadmin.ru:
[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.

Вы можете увидеть, насколько простым и читаемым является файл конфигурации, даже если вы не убежденный программист.

инициализация терраформирования

Теперь первый шаг — инициализировать 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. Когда вы запускаете команду «Применить», она спросит вас: «Вы хотите выполнить эти действия?», вам нужно ввести «да» и нажать «Ввод».

[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, и вы увидите, что новый экземпляр с идентификатором экземпляра, указанным в конце команды применения, создан.

Вы успешно запустили инстанс AWS EC2 с помощью 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».