Что такое Terraform и почему это круто

14 июнь, 2018 - 16:18Владимир Федак

Управление конфигурациями является важной частью методологии DevOps, и инструменты наподобие Ansible, Chef, Puppet или SaltStack составляют основу современных систем разработки программного обеспечения. Terraform - пример системы следующего поколения для создания, управления и конфигурации облачной инфраструктуры.

Итак, поговорим про утилиту для так называемого “оркестрирования” облачной инфраструктуры, позволяющей любому оператору работать с любым публичным или частным провайдером услуг облачного хостинга. Плюс к этому с помощью такого инструмента можно легко создавать облачную инфраструктуру как код (Infrastructure as Code), управлять ею и улучшать в дальнейшем. Являясь частью экосистемы Hashicorp, включающей также Vagrant, Packer, Consul, Vault и Nomad, Terraform позволяет разместить ЛЮБОЕ приложение, написанное на ЛЮБОМ языке на ЛЮБУЮ инфраструктуру.

Лишь несколько из ряда преимуществ Terraform:

  • Оркестрирование, а не просто конфигурация инфраструктуры.
  • Построение неизменяемой инфраструктуры.
  • Декларативный, а не процедурный код.
  • Архитектура, работающая на стороне клиента.

Terraform как инструмент для оркестрирования серверов

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

Неизменяемая инфраструктура

При использовании Chef, Salt, Puppet, или Ansible, любое обновление ПО нужно проводить там, где оно установлено. Таким образом, со временем каждый сервер приобретает свою уникальную конфигурацию и историю обновлений ПО. Это приводит к так называемому “конфигурационному дрифту”, когда незначительные различия в применяемом в облачной экосистеме ПО приводят к появлению потенциальных точек доступа для хакеров и уязвимости системы. Terraform работает по концепции неизменяемой инфраструктуры, где каждое изменение какого-либо компонента (обновление ПО, удаление или добавление компонентов, и т.д.) приводит к созданию отдельного состояния инфраструктуры, то есть к построению новой системы и удалению предыдущей конфигурации. Это означает, что процесс обновления ПО идет легко и быстро по всей системе сразу и защищен от возможных ошибок. В то же время, возврат к любой предыдущей конфигурации системы работает не сложнее, чем выбор требуемой конфигурации из списка и создание нового окружения по требуемым параметрам.

Декларативный код

При использовании Chef или Ansible вы вынуждены писать пошаговые процедурные инструкции по достижению требуемого состояния системы. Напротив, Terraform, Salt или Puppet предпочитают отписывать конечные состояния системы, оставляя конфигурацию на усмотрение утилиты.

Почему это круто? Потому что довольно ограниченная библиотека шаблонов кода может удовлетворить ЛЮБЫЕ запросы по конфигурации инфраструктуры, а встроенные примитивы позволяют писать довольно сложный по уровню воздействия, но очень легко читаемый модульный код.

Применяя процедурный код, вам необходимо помнить о всех текущих в системе процессах и недавних событиях, чтобы создать простую и однозначную инструкцию. При использовании Terraform, вы просто указываете утилите, какие изменения нужно произвести с ТЕКУЩИМ состоянием системы, что позволяет обходиться довольно компактной и очень простой библиотекой шаблонов кода.

Архитектура, работающая на стороне клиента

Terraform использует API, предоставляемые поставщиком облачного хостинга. С их помощью утилита строит инфраструктуру, что означает уход от излишних проверок безопасности, отсутствие необходимости в работе отдельного сервера для управления конфигурациями и выделение ресурсов на работу многочисленных программ-агентов. Ansible достигает сходного результата путем работы через SSH. но возможности данного метода довольно ограничены. Благодаря тому, что Terraform работает через API, этот инструмент предоставляет буквально безграничную свободу действий и возможных вариантов конфигураций. Такой подход гораздо лучше с точки зрения безопасности, надежности работы и общей простоты использования системы.

Недостатки Terraform

Так как Terraform появился относительно недавно, он еще далеко не идеален. Например, разработчик однажды исправил баг в Terraform ignition provider и убрал indents из JSON, что привело к необходимости перенастройки всех ранее размещенных конфигураций.

Другой немаловажный момент заключается в том, что как дирижерскую палочку может использовать только один дирижер, так и Terraform желательно использовать одному оператору - или хотя бы с одного терминала. Довольно часто, запуск одной и той же команды с разных машин (с разными конфигурациями Terraform и прочего ПО) приводил к различным результатам. Само собой, это поднимает нерешенные вопросы о управлении процессом и возможностях нахождения ответственного за ту или иную проблему. Пока эти вопросы не решены разработчиком, работать с Terraform лучше в одиночку (или посменно, но с одного терминала).

Третий существенный недостаток Terraform заключается в том, что утилита была разработана только под облако и непригодна для использования с кластерами выделенных серверов, хотя более опытные конкуренты типа Salt, Ansible, Puppet прекрасно с этим справляются, ведь их разработали более 5 лет назад именно для такой работы. Это делает Terraform достаточно специфичным решением, которое не может подойти в 100% сценариев.

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

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

Два основных преимущества Terraform:

  • Супер-портативность — одна утилита и один язык применяется для описания облачной инфраструктуры в Google Cloud, AWS, OpenStack и  работы с ЛЮБЫМ другим поставщиком услуг. Смена поставщика облачного хостинга больше никогда не будет проблемой.
  • Простота полноценного запуска приложений — предположим, на ваших серверах Amazon запущены Docker контейнеры под управлением Kubernetes, в которых работает широкий спектр приложений - и все это с легкостью управляется с помощью одного инструмента.


Я считаю, что Terraform в данный момент является одной из лучших утилит для управления конфигурациями облачной инфраструктуры. Возможно, этот инструмент еще не так популярен как Salt, Ansible, или Puppet, но уверен, что со временем эта утилита приобретёт гораздо большую популярность. Разработчики Vagrant и Consul еще раз доказали свое мастерство и предоставили удобный и полезный продукт.

Так как Terraform это решение с открытым кодом, его развитие поддерживается большим и непрерывно растущим сообществом разработчиков. Terraform, несомненно, крут, и со временем станет только лучше. Эта утилита не станет “убийцей” Salt, Ansible, или Puppet, но по праву займет достойное место в инструментарии любого DevOps инженера.