Основы Terraform: работа и задачи

Ранее мы рассказали про Ansible, его возможности и сделали проект по разворачиванию LEMP-стека. Настало время двигаться дальше и начать мыслить еще глобальнее. Будем разбираться с Terraform.

В этой статье будет теория, матчасть и подготовительный этап, а в следующей статье — практика. Мы будем разворачивать инфраструктуру в виртуальном ЦОДе VMware. Меньше слов — больше дела. Стартуем!

Что такое Terraform и какие задачи он решает?

Что такое Terraform

Terraform — это Open source решение для управления IaC от компании Hashicorp, вышедшее в 2014 году. Terraform придерживается декларативного стиля управления инфраструктурой. Это значит, что вы описываете финальное состояние инфраструктуры в конфигурационном файле, а Terraform приводит её к нему.

Например, у вас есть 10 серверов развернутых в AWS. Со временем нагрузка на них увеличилась — нужно развернуть ещё 5 серверов. Вот как это будет выглядеть в коде:

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

Несложно заметить, что синтаксис приведенного нами кода не похож на устоявшиеся языки описания инфраструктуры: JSON и YAML. Действительно, для написания Terraform конфигов используется свой язык — Hashicorp Configuration Language (HCL).

 

Если вы давно хотели познакомиться с YAML, но не находили подходящего материала — загляните в нашу базу знаний. В ней есть множество полезных и практических статей, одна из них посвящена подробному разбору синтаксиса YAML с примерами его использования.

 

Главная фишка Terraform — это возможность расширения инструментария за счет установки дополнительных модулей. В терминологии Terraform — «провайдеров».

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

 

Вот GitHub провайдера от VMware — vcd, который мы будем использовать в будущем для управления виртуальным ЦОДом. Настоятельно рекомендуем ознакомиться с проектом и кратким мануалом по его установке.

 

Итак, будем заканчивать с теоретическим экскурсом и перейдём к более техническим вещам. Давайте, подытожим, что такое Terraform и какие задачи он решает:

  1. Terraform — это система управления состоянием инфраструктуры, придерживающаяся подхода идемпотентности и декларативного стиля управления.
  2. Основная задача Terraform — это легкое и простое управление состоянием инфраструктуры.

Рассмотрим теперь как устроен Terraform и разберёмся в том, как он работает.

Как устроен Terraform

Как устроен Terraform

Terraform написан на Go и поставляется в виде скомпилированной готовой программы, которая от вашего имени, используя «провайдеры» посылает API-запросы нужному вам облачному провайдеру.

 

Провайдеры Terraform написаны на Go. Поставляются они в виде исходного кода, который нужно компилировать. Без установленного в систему Go скомпилировать исходники не выйдет. О том как установить Go на Linux-систему можно узнать из нашей инструкции.

 

Terraform позволяет одновременно использовать любое количество провайдеров для различных задач. Вот пример кода сразу двух действий на разных облачных провайдерах — AWS и Google Cloud:

resource "aws_instance" "example" {
  ami = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

resource "google_dns_record_set" "a" {
  name = "demo.google-example.com"
  managed_zone = "example-zone"
  type = "A"
  ttl = 300
  rrdatas = [aws_instance.example.public_ip]
}

В первом блоке — API-запрос на создание сервера в AWS, во втором блоке — добавление DNS-записи в Google Cloud. Подобные конфиги обычно хранятся на github и все желаемые изменения инфраструктуры вносятся в код, а потом применяются.

 

Процесс работы с Terraform выстроен следующем образом:

  1. Желаемое состояние инфраструктуры описывается в конфигурационном файле;
  2. В нем же указывается провайдер, который будет исполнять работу;
  3. Применяется последовательность 3 команд:
    • terraform init — инициализация провайдера;
    • terraform plan — валидация конфигурационного файла;
    • terraform apply — применение конфигурации.

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

 

Графически работу терраформа можно представить так:

Разберем подробнее каждый из блоков:

  • Первый блок — Terraform состоит из CLI (самого ядра Terraform), Config (конфигурационный файл описывающий инфраструктуру) и State(файл содержащий текущее состояние инфраструктуры).
  • Второй блок — Plugins, в нём содержатся провайдеры (модули подключения к API облачных провайдеров).
  • Третий блок — облачные провайдеры.

Как видите, всё довольно просто, если не вдаваться в детали работы Terraform изнутри. Хорошо, Terraform разворачивает инфраструктуру, а кто работает с ПО и софтом на виртуальных серверах? Ansible.

Взаимодействие Terraform с другими средствами IaC

Terraform и Ansible

Terraform используется для развертывания всей инфраструктуры, включая сети, хранилища данных (MySQL, Redis), балансировщики нагрузки и серверы. Ansible берет на себя развертывание приложений поверх этих серверов.

 

Графически это можно представить так:

Такой симбиоз двух систем управления IaC позволяет быстро приступить к работе, поскольку вам не нужна никакая дополнительная инфраструктура (Terraform и Ansible — клиентские приложения, не требующие установки агентов на удаленные серверы). К тому же, их обоих можно интегрировать множеством разных способов (например, Terraform назначает вашим серверам специальные теги, которые Ansible использует для поиска и конфигурации этих серверов).

Конечно, вы можете использовать и иную связку. Например, Terraform + Packer + Docker + Kubernetes.

Packer создаст образы ВМ с установленными Docker и Kubernetes, а Terraform развернет серверы с помощью этих образов и всю остальную инфраструктуру. Когда серверы загрузятся, они сформируют кластер Kubernetes, на котором можно запускать и администрировать контейниризированные приложения.

 

Схематически эту связку можно представить так:

Преимущества такой связки в том, что образы Docker собираются довольно быстро, поэтому их можно запускать и тестировать на локальном компьютере. Вы также можете использовать богатые возможности Kubernetes, включая различные стратегии развертывания, автовосстановление, автомасштабирование и т. д. Недостаток тут, пожалуй, один — довольно высокая сложность кода. В нём легко запутаться и тяжело поддерживать.

Давайте, резюмируем все вышесказанное и будем двигаться дальше, к практике работы с Terraform и VMware Cloud Director.

Собираем всё воедино

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

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

Для взаимодействия с API облачных провайдеров Terraform использует специальные модули — «провайдеры», которые можно скачать с официальных репозиториев GitHub.

Terraform работает с инфраструктурой, а с ПО и ОС на серверах работают другие системы управления IaC: Ansible, Chef, Salt и т.д. Они могут применяться в связке с Docker и иными системами контейнеризации.

В следующей публикации мы поработаем с VMware Cloud Director и развернем в виртуальном ЦОДе инфраструктуру. Если вы хотите ближе познакомиться с Ansible, Docker, контейнеризацией и клауд директором — в нашем блоге есть статьи посвященные им всем: