Подход, который используется в Terraform, позволяет писать код для каждого провайдера отдельно, пользуясь его уникальными возможностями; при этом внутри для всех провайдеров применяются тот же язык, инструментарий и методики IaC.
Сравнение Terraform с другими средствами IaC
Инфраструктура как код — замечательная идея, чего нельзя сказать о процессе выбора инструментов IaC. Многие из них пересекаются в своих возможностях, имеют открытый исходный код и предоставляют коммерческую поддержку. Если вы не использовали каждый из них лично, не совсем понятно, по каким критериям следует выбирать.
Все усложняется тем, что большинство сравнений этих инструментов, которые вы найдете, просто перечисляют их общие характеристики. В итоге может показаться, что выбор любого из них будет одинаково удачным. Хотя теоретически все действительно так, это никак не помогает с выбором. Это как если бы вы уверяли новичка в программировании в том, что сайт можно одинаково успешно написать на PHP, C и ассемблере — формально все верно, но при этом опускается много важной информации, без которой нельзя принять хорошее решение.
В следующих разделах я подробно сравню самые популярные средства управления конфигурацией и инициализации ресурсов: Terraform, Chef, Puppet, Ansible, SaltStack, CloudFormation и OpenStack Heat. Моя цель — помочь вам определиться с тем, является ли Terraform хорошим выбором. Для этого я объясню, почему моя компания, Gruntwork (www.gruntwork.io), выбрала Terraform в качестве средства IaC и — в каком-то смысле — почему я написал эту книгу9. Как и с любым техническим решением, все сводится к компромиссам и приоритетам. Даже если ваши задачи отличаются от моих, надеюсь, что описанный здесь ход мыслей поможет вам принять собственное решение.
Вам придется выбирать между такими вещами, как:
• управление конфигурацией или инициализация ресурсов;
• изменяемая или неизменяемая инфраструктура;
• процедурный или декларативный язык;
• наличие или отсутствие центрального сервера;
• наличие или отсутствие агента;
• большое или маленькое сообщество;
• зрелость или новизна.
Или же совместно использовать несколько инструментов.
Управление конфигурацией или инициализация ресурсов?
Как упоминалось ранее, Chef, Puppet, Ansible и SaltStack управляют конфигурацией, тогда как CloudFormation, Terraform и OpenStack Heat инициализируют ресурсы. Это не совсем четкое разделение, так как средства управления конфигурацией обычно в какой-то степени поддерживают инициализацию ресурсов (например, вы можете развернуть сервер с помощью Ansible), а средства инициализации ресурсов занимаются какого-то рода конфигурацией (скажем, на каждом сервере, инициализированном с помощью Terraform, можно запускать конфигурационные скрипты). Поэтому следует выбирать тот инструмент, который лучше всего подходит для вашего случая10.
В частности, если вы используете средство шаблонизации серверов, такое как Docker или Packer, оно уже покрывает большинство ваших нужд, связанных с управлением конфигурацией. После создания образа из Dockerfile или шаблона Packer вам остается лишь инициализировать для него инфраструктуру, здесь лучше всего подходят средства инициализации ресурсов.
Тем не менее, если вы не применяете инструменты для шаблонизации серверов, хорошей альтернативой будет связка из средств управления конфигурацией и инициализации ресурсов. Например, вы можете инициализировать серверы с помощью Terraform и затем запустить Chef, чтобы сконфигурировать каждый из них.
Выбор между изменяемой и неизменяемой инфраструктурой
Обычно в средствах управления конфигурацией, таких как Chef, Puppet, Ansible и SaltStack, по умолчанию применяется парадигма изменяемой инфраструктуры. Например, если приказать Chef установить новую версию OpenSSL, процесс обновления ПО запустится на существующем сервере, где и произойдут все изменения. Со временем обновления накапливаются, а вместе с ними и история изменений сервера. В итоге у каждого сервера появляются небольшие отличия по сравнению со всеми остальными серверами, что приводит к неочевидным ошибкам в конфигурации, которые трудно диагностировать и воспроизводить (та же проблема с дрейфом конфигурации, возникающая при ручном управлении серверами, хотя благодаря средствам управления конфигурацией у нее куда менее серьезные последствия). Их сложно обнаружить даже с использованием автоматических тестов. Измененная конфигурация может нормально работать в ходе тестирования и при этом вести себя совсем иначе на боевом сервере, который, в отличие от тестовой среды, месяцами накапливал обновления.