Хотите знать, что такое 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».