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

Возможно, вы задаетесь вопросом: что такое Инфраструктура как код? Как она улучшает процесс разработки и опыт, и в чем роль Terraform? Давайте рассмотрим все это и многое другое в этом руководстве. Но прежде чем мы начнем, вот несколько предварительных требований:

  • Базовые знания облачных технологий и терминологии облака

  • Доступ к ПК для внедрения примеров кода

  • Учетная запись GCP

Итак, приступим.

Вот что мы рассмотрим:

  1. Обзор Инфраструктуры как кода

  2. Что такое Terraform?

  3. Преимущества Terraform

  4. Общие термины, используемые в Terraform

  5. Демонстрационный проект: Как написать конфигурацию Terraform

  6. Заключение

Обзор инфраструктуры как кода (IaC)

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

Существуют два различных подхода к инфраструктуре как коду: императивный подход и декларативный подход.

При использовании декларативного подхода к созданию инфраструктуры вы просто указываете ожидаемые/желаемые выходные данные для создания инфраструктуры, а затем используемый вами инструмент IaC определяет, как создать этот результат.

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

Некоторые инструменты способны к обоим подходам, в то время как другие подходят только для одного из них. Примеры некоторых популярных инструментов IaC, используемых по всему миру, включают Terraform IaC, AWS Cloud Formation, Ansible и Pulumi, Chef и другие.

Как следует из названия — инфраструктура как код — код, создающий инфраструктуру, написан на различных языках шаблонов в пространстве IaC. Популярные языки шаблонов включают JSON, YAML, ARM-шаблоны, HCL, сценарии Heat и так далее.

Вы также можете использовать сценарные инструменты для выполнения облачной инфраструктуры. Некоторые популярные из них включают Bash и PowerShell. Иногда они поставляются предустановленными на большинстве персональных компьютеров.

Из всех этих инструментов Terraform является особенным по различным причинам – именно его мы будем рассматривать в этой статье.

Что такое Terraform?

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

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

Также, как и другие инструменты IaC, использующие языки шаблонов, фреймворк шаблонов, используемый для создания инфраструктуры в Terraform, – это язык шаблонов HashiCorp (HCL).

Преимущества Terraform

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

1. Декларативный подход

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

2. Обработка конфликтов

В дополнение к его эффективным возможностям автоматизации облачных инструментов, Terraform обладает надежными свойствами обнаружения и обработки конфликтов. Один из способов решения конфликтов – это функция Terraform plan. Эта функция выделяет любые воспринимаемые или потенциальные конфликты в оркестрации инфраструктуры, что позволяет легко вносить исправления перед развертыванием. Я расскажу об этом подробнее в последующих разделах.

3. Облачно-независимый

Terraform – это многоцелевой сервис автоматизации многократных облачных услуг с эффективными возможностями автоматизации инфраструктуры на основных облачных поставщиках услуг (AWS, GCP и Azure). Он также позволяет гибридную и межпровайдерскую автоматизацию.

4. Удобный для пользователя

Terraform – один из крупнейших инструментов автоматизации облака с самыми крупными сообществами пользователей. У него есть обширные обучающие материалы для начинающих, которые помогут вам быстро освоить инструмент. Вот ссылка на его документацию, чтобы вы могли погрузиться глубже.

5. Возможности управления файлами

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

6. Управление версиями

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

7. Повторное использование кода

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

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

Общие термины, используемые в Terraform

Прежде чем начать использовать Terraform, вам следует ознакомиться с некоторыми ключевыми терминами, которые часто встречаются. Вот, что вам нужно знать:

  1. Провайдеры: в Terraform провайдер – это программный интерфейс, который позволяет Terraform взаимодействовать с различными API и облачными службами. Например, вы бы использовали провайдер для взаимодействия с облачным поставщиком услуг, таким как GCP или Azure.

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

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

  4. Состояние: Концепция состояния в Terraform формирует основу его эффективности. Состояние отслеживает текущую конфигурацию ваших ресурсов инфраструктуры и содержит детали о каждом ресурсе, который Terraform создал, изменил или удалил. Система контроля версий Terraform использует его для отслеживания любых изменений, которые вы вносите в файл кода, и использует эту информацию для уничтожения и предоставления инфраструктуры по мере необходимости.

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

Демо проект: Как написать конфигурацию Terraform

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

Общие команды Terraform

  • Terraform init: Эта команда инициализирует инструмент Terraform и загружает необходимые файлы, специфичные для облачного провайдера. Она также устанавливает соединение между Terraform и соответствующим облачным провайдером. В нашем случае это соединение между GCP и провайдером Terraform.

  • Terraform fmt: Эта команда автоматически обеспечивает оптимальное форматирование кода и отступы. Она гарантирует упорядоченное выполнение кода и минимизирует возможные ошибки.

  • Terraform plan: Эта команда очерчивает шаги выполнения кода Terraform и обнаруживает любые ошибки, которые могут возникнуть в процессе выполнения. Она также подчеркивает любые ошибки в коде Terraform, которые могут помешать выполнению. Наконец, она работает совместно с управлением состоянием Terraform, чтобы обнаружить любые изменения состояния и при необходимости де-пр Provision или создать дополнительные облачные сервисы.

  • Terraform apply: Эта команда выполняет запланированное состояние Terraform, реализованное командой Terraform plan.

  • Terraform destroy: Эта команда является финальной командой в схеме Terraform, которая используется для деактивации или уничтожения всех облачных сервисов, созданных с помощью команды Terraform apply. Важно отметить, что вы должны выполнять перечисленные выше команды последовательно, чтобы гарантировать правильное создание вашей инфраструктуры.

Создание виртуальной машины GCP с использованием IaC

Теперь, когда вы узнали эти важные команды, давайте протестируем их все, создав нашу первую виртуальную машину GCP, управляемую IaC.

В вашем редакторе кода введите следующий код:

provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"        
}

Этот код подчеркивает облачного провайдера, которого мы используем для генерации необходимых облачных ресурсов. В нашем случае это программа Google Cloud. Название, присвоенное ей, — просто «google». Другие облачные провайдеры, такие как AWS и Azure, называются «aws» и «azure» соответственно.

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

Вам также нужно будет указать подходящий регион ресурса и зону доступности ресурса. Это будет физической основой для виртуальной машины, которую мы создадим, чтобы запустить её. В этом сценарии я выбрал центральный регион США и зону доступности 1-a соответственно. Вы можете прочитать больше здесь о регионах облака и зонах доступности.

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"      
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11" 
    }
  }

Фрагмент кода выше указывает точный вычислительный ресурс, который будет оркестрирован, который в нашем случае является экземпляром виртуальной машины, закодированным как “vm_instance”. 'example-vm' — это имя, которое мы хотим присвоить виртуальной машине, которую мы будем создавать для этого проекта. Важно отметить, что имя виртуальной машины также должно быть уникальным. Тип виртуальной машины, который мы выбрали, был E2 (Общего назначения) – средний тип ВМ. Вы можете получить больше информации о типах виртуальных машин здесь.

Далее мы также указываем ожидаемую загружаемую операционную систему (“boot_disk”), которая является образом операционной системы Debian Linux версии 11 в моем случае.

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

Для завершения создания нашей виртуальной машины нам необходимо настроить виртуальную сеть, чтобы обеспечить удаленный доступ к ВМ. Блок интерфейса сети соединяет виртуальную машину с сетью VPC (виртуальная частная облако), предоставленной GCP. Мы не сможем взаимодействовать с нашей виртуальной машиной без сети VPC. Блок вывода также отображает IP-адрес доступа по умолчанию в терминале, который мы можем использовать для подключения к виртуальной машине.

Вот окончательный ожидаемый код:


provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"       
}

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"         
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"  
    }
  }

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

Продолжая с этого момента, мы теперь будем выполнять этот код, используя команды, выделенные на изображении ниже:

Команда terraform -v подтверждает, что Terraform успешно установлен в терминале. Ожидаемым результатом будет версия установленного инструмента Terraform.

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

Команда terraform fmt также запускается для обеспечения адекватного форматирования кода и отступов. Затем последовательно выполняется команда terraform plan.

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

Пос успешному выполнению плана Terraform мы затем выполним функцию terraform apply, чтобы выполнить шаги, описанные планом Terraform.

Это вызовет запрос о подтверждении выполнения Terraform, как показано выше. Ввод “Yes” позволит операции выполняться без проблем.

При успешном выполнении будет отображено сообщение об успехе, как показано выше. С этим мы создали нашу облачную инфраструктуру всего лишь с помощью кода. Команду terraform destroy можно вызвать для удаления созданных виртуальных машин.

Заключение

В этой статье вы узнали основы инфраструктуры как кода. Мы обсудили Terraform, его преимущества и некоторые его ключевые функции и команды. Мы также проиллюстрировали его использование в демонстрационном проекте.

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

Не стесняйтесь писать мне с любыми комментариями или вопросами. Вы также можете ознакомиться с моими другими статьями здесь. До следующего раза, продолжайте кодить!