Ранее мы рассказали про Ansible, его возможности и сделали проект по разворачиванию LEMP-стека. Настало время двигаться дальше и начать мыслить еще глобальнее. Будем разбираться с Terraform.
В этой статье будет теория, матчасть и подготовительный этап, а в следующей статье — практика. Мы будем разворачивать инфраструктуру в виртуальном ЦОДе VMware. Меньше слов — больше дела. Стартуем!
Что такое Terraform и какие задачи он решает?
Terraform — это Open source решение для управления IaC от компании Hashicorp, вышедшее в 2014 году. Terraform придерживается декларативного стиля управления инфраструктурой. Это значит, что вы описываете финальное состояние инфраструктуры в конфигурационном файле, а Terraform приводит её к нему.
Например, у вас есть 10 серверов развернутых в AWS. Со временем нагрузка на них увеличилась — нужно развернуть ещё 5 серверов. Вот как это будет выглядеть в коде:
Код инфраструктуры в AWS
resource "aws_instance" "example" {
count = 10
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
Код инфраструктуры в Terraform
resource "aws_instance" "example" {
count = 15
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
Вы меняете только количество серверов с 10 на 15. В итоге Terraform добавит 5 новых серверов, а не создаст ещё 15 новых серверов. Такой подход и называется декларативным.
Несложно заметить, что синтаксис приведенного нами кода не похож на устоявшиеся языки описания инфраструктуры: JSON и YAML. Действительно, для написания Terraform конфигов используется свой язык — Hashicorp Configuration Language (HCL).
Если вы давно хотели познакомиться с YAML, но не находили подходящего материала — загляните в нашу базу знаний. В ней есть множество полезных и практических статей, одна из них посвящена подробному разбору синтаксиса YAML с примерами его использования.
Главная фишка Terraform — это возможность расширения инструментария за счет установки дополнительных модулей. В терминологии Terraform — «провайдеров».
Провайдеры разрабатываются различными комьюнити, вклад в развитие проекта может внести каждый желающий. Обычно у провайдеров есть свой репозиторий на GitHub, откуда его можно скачать, скомпилировать и установить.
Вот GitHub провайдера от VMware — vcd, который мы будем использовать в будущем для управления виртуальным ЦОДом. Настоятельно рекомендуем ознакомиться с проектом и кратким мануалом по его установке.
Итак, будем заканчивать с теоретическим экскурсом и перейдём к более техническим вещам. Давайте, подытожим, что такое Terraform и какие задачи он решает:
- 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 выстроен следующем образом:
- Желаемое состояние инфраструктуры описывается в конфигурационном файле;
- В нем же указывается провайдер, который будет исполнять работу;
- Применяется последовательность 3 команд:
- terraform init — инициализация провайдера;
- terraform plan — валидация конфигурационного файла;
- terraform apply — применение конфигурации.
Работа с Terraform максимально проста: создается конфиг будущей инфраструктуры и применяется поочередно 3 команды.
Графически работу терраформа можно представить так:
Разберем подробнее каждый из блоков:
- Первый блок — Terraform состоит из CLI (самого ядра Terraform), Config (конфигурационный файл описывающий инфраструктуру) и State(файл содержащий текущее состояние инфраструктуры).
- Второй блок — Plugins, в нём содержатся провайдеры (модули подключения к API облачных провайдеров).
- Третий блок — облачные провайдеры.
Как видите, всё довольно просто, если не вдаваться в детали работы Terraform изнутри. Хорошо, Terraform разворачивает инфраструктуру, а кто работает с ПО и софтом на виртуальных серверах? Ansible.
Взаимодействие Terraform с другими средствами IaC
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, контейнеризацией и клауд директором — в нашем блоге есть статьи посвященные им всем:
Знакомство с Ansible
Рассказываем, что такое инфраструктура как код и знакомимся с концепциями Ansible.
Введение в Docker
Доступно рассказываем о том, что такое Docker и из каких элементов он состоит.
VMware Cloud Director
Что такое VCD, какими возможностями и преимуществами обладает перед Open source-решениями.