Давайте взглянем на текущее положение вещей в индустрии высоких технологий. Все только и говорят, что о DevOps да об облаке, но задачи, связанные с управлением ресурсами сервера и инфраструктуры, определенно пока не входят в разряд легких задач. Если мы выкатываем изменение только на один сервер, это, вероятно, будет не так уж сложно. Но как бы вы справились с заливкой но десятки или сотни серверов? Многие команды по-прежнему практикуют развертывание ресурсов инфраструктуры в облаке вручную, а эта практика зачастую увеличивает вероятность сбоя по мере каждого нового обновления и создает сложные ситуации, из которых нужно восстанавливаться, если что-то пойдет не так.

DevOps может подразумевать несколько разных вещей. DevOps несет культурную трансформацию, которая нацелена то, чтобы каждый инженер чувствовал себя продуктивным и гибким. DevOps также может означать достижение высокой частоты развертываний, при которой сохраняется стабильность. Для обеспечения автоматизации наиболее важной частью DevOps, вероятно, является создание потока ценности (value stream). Чтобы решить эту задачу, многие люди часто рассматривают возможность использования конвейера, такого как Jenkins или GitHub Actions. В то же время в современной экосистеме DevOps наблюдается быстрый рост относительно новой области под названием Infrastructure as Code (инфраструктура как код), так же известной в своей короткой форме — IAC.

IAC, или Infrastructure as Code, представляет собой процесс подготовки (provisioning) и управления компьютерными центрами обработки данных с помощью машиночитаемых файлов определений, а не физической конфигурации оборудования или интерактивных инструментов конфигурации. Хотя область IAC является относительно новой по сравнению с конвейером автоматизации DevOps, уже существует достаточно много IAC-инструментов, и новые технологии продолжают развиваться даже в этот самый момент. И я рад сообщить вам, что большинство из них — проекты с открытым исходным кодом. В этой статье я хочу представить вам некоторые из наиболее известных и широко используемых IAC-инструментов, распространяемых по опенсорсным лицензиям.

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

Термин

Что это означает

Agent vs Agentless

(с агентами/без агентов)

IAC-инструмент может требовать запуска агента на каждом сервере, который вы хотите настроить. Если нет, то такой инструмент называется «agentless».

Mutable vs Immutable

(изменяемая/неизменяемая)

Некоторые инструменты, такие как Terraform, занимаются не изменением уже подготовленной (provisioned) инфраструктуры, а развертывают новый сервер, что означает, что они следуют парадигме неизменяемой (immutable) инфраструктуры. Другие инструменты, такие как Ansible, Chef, SaltStack и Puppet, могут изменять существующие ресурсы, а это означает, что эти инструменты следуют парадигме изменяемой (mutable) инфраструктуры.

Procedural vs Declarative

(процедурные/декларативные)

Процедурные языки, такие как Ansible и Chef, позволяют описывать с помощью кода поэтапное выполнение, в то время как декларативные языки, такие как Terraform, SaltStack и Puppet, позволяют просто указать желаемое состояние.

Master vs Masterless

(с мастером/без мастера)

Языки, такие как Chef, требуют, чтобы вы запускали отдельный главный сервер (master), чтобы обеспечить дополнительное управление и постоянные состояния. Другие языки, такие как Ansible и Terraform, не нуждаются в определении мастера.

Configuration vs Provisioning

Ansible, Chef, SaltStack и Puppet известны как инструменты управления конфигурацией, что означает, что их основная цель — настроить ресурсы. Другие инструменты, такие как Terraform и Pulumi, являются инструментами обеспечения (provisioning), а это означает, что их основная цель — предоставлять ресурсы. Однако по мере того, как инструменты развиваются, их функционал может начать пересекаться.

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

Имя

Описание

Синтаксис

Лицензия

Сайт

GitHub репозиторий

Terraform

Terraform — это программный IAC-инструмент, созданный HashiCorp. Он известен как декларативный provisioning-инструмент без агентов и без мастера. 

.tf файл (похож на JSON)

MPL 2.0

terraform.io

github.com/hashicorp/terraform

Ansible

Поддерживаемый Red Hat, Ansible — это программный IAC-инструмент, вмещающий в себе provisioning, управление конфигурацией и развертывания приложений.

YAML

GPL 3.0

ansible.com

github.com/ansible/ansible

Chef

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

Ruby

Apache 2.0

chef.io/products/chef-infra

github.com/chef/chef

Puppet

Puppet — это инструмент управления конфигурацией программного обеспечения, который имеет собственный декларативный язык для описания конфигурации системы.

Язык Puppet (похож на JSON) или Ruby

Apache 2.0

puppet.com

github.com/puppetlabs/puppet

SaltStack

Поддерживаемый VMWare, SaltStack — это программное обеспечение с открытым исходным кодом на основе Python для управляемой событиями (event-driven) IT-автоматизации, удаленного выполнения задач и управления конфигурацией.

Python

Apache 2.0

repo.saltproject.io

github.com/saltstack/salt

Pulumi

IAC SDK с открытым исходным кодом Pulumi позволяет создавать, развертывать и управлять инфраструктурой в любом облаке, используя ваши любимые языки.

Различные языки программирования

Apache 2.0

pulumi.com

github.com/pulumi/pulumi

Итак, без лишних отлагательств, приступим.

Terraform

Terraform — созданный HashiCorp инструмент с открытым исходным кодом, имеющий Mozilla Public License (MPL 2.0). Это provisioning-инструмент, с помощью которого вы можете развертывать ресурсы инфраструктуры на облачном сервере, таком как AWS, Azure и GCP. Файлы конфигурации Terraform имеют собственное расширение, именуемое .tf, но оно основано на синтаксисе JSON. Terraform — это декларативный provisioning-инструмент без мастера и без агентов, который поддерживает неизменяемую инфраструктуру. Простой скрипт Terraform, устанавливающий инстанс EC2 на AWS, может выглядеть следующим образом:

Как вы можете заметить, декларативный синтаксис Terraform очень прост и понятен, что является одной из причин, по которой многие люди предпочитают Terraform для provisioning’а инфраструктуры, хотя у них есть возможность использовать Ansible, Puppet или другие инструменты управления конфигурацией для настройки ресурсов.

Terraform, разработанный в 2014 году, является вторым самым молодым IAC-инструментом среди этой группы, в которой самым молодым является Pulumi. На момент написания этой статьи Terraform все еще не достиг GA версии (General Availability - общедоступной), а последняя версия - 0.15.4. Тем не менее, Terraform по-прежнему широко популярен, и этот инструмент пользуется огромной поддержкой сообщества. На момент написания этой статьи насчитывалось более 28K коммитов и более 1500 контрибьюторов. Вы можете найти его GitHub по следующей ссылке:

Ansible

Ansible - это инструмент управления конфигурацией с лицензией GPL 3.0. Вы можете найти его исходный код в следующем GitHub репозитории:

Ansible — это инструмент управления конфигурацией, то есть он предназначен для установки и управления программным обеспечением и состояниями на существующем сервере, и он поддерживает изменяемую инфраструктуру и процедурный язык, являясь при этом безагентным и безмастерным. Среди этих особенностей Ansible две наиболее заметные: (1) безагентность и (2) безмастерность. Например, вы можете просто использовать SSH-ключи для подключения к каждому серверу, который хотите настроить — этот процесс намного упрощает управление инфраструктурой.

Позже Ansible расширил свои возможности, чтобы также выполнять функцию provisioning’а, что частично совпадает с основной задачей Terraform. Файлы конфигурации Ansible основаны на формате YAML, который представляет собой метатекстовый файл, основанный на отступах. Вот пример YAML-файла, который выводит отладочное сообщение «Hello, Ansible» в Ansible.

На момент написания этой статьи у Ansible более 51 тыс. коммитов и 5 тыс. контрибьюторов в его основном репозитории на GitHub. Из такой активности смело можно делать вывод, что Ansible — это хороший IAC-инструмент для начала!

Chef

Нет, Chef не связан с кулинарией! Chef — еще один инструмент управления конфигурацией, который также довольно популярен среди предприятий. В отличие от Terraform или Ansible, Chef требует, чтобы вы установили мастер-сервер и запустили агентов на серверах, с которыми вы хотите работать. Наличие мастера и агентов может иметь несколько преимуществ. Например, мастер-сервер может быть центральным местом, из которого можно управлять и контролировать всю инфраструктуру, а также местом, которое предлагает непрерывное обновление конфигурации. Наличие агентов может гарантировать правильную работу обновлений. Однако, агенты и мастер-сервер также предполагают дополнительное обслуживание большую уязвимость. Когда вы выбираете IAC для начала, вы должны убедиться, какой инструмент лучше всего подходит для вашей ситуации.

Файл конфигурации Chef основан на языке программирования Ruby, который может дать вам некоторую гибкость, если вы хотите попробовать дополнительную логику управления. Простой скрипт «Hello, Chef» может выглядеть так:

Chef имеет лицензию Apache 2.0, и вы можете найти его исходный код в следующем GitHub репозитории:

На данный момент там более 30 000 коммитов и 651 контрибьютор.

Puppet

Puppet — это инструмент управления конфигурацией программного обеспечения с декларативным синтаксисом, требующий наличия мастер-сервера и агентов. Puppet — это инструмент с открытым исходным кодом, имеющий лицензию Apache 2.0. Язык программирования Puppet — это декларативный язык, который описывает состояние компьютерной системы в терминах «ресурсов», которые представляют собой базовые конструкции сети и операционной системы. Пользователь собирает ресурсы в манифесты, которые описывают желаемое состояние системы.

Файл конфигурации Puppet, подобный JSON, может выглядеть следующим образом:

Открытый исходный код Puppet содержит более 33 000 коммитов и 558 контрибьторов. Вы можете найти исходный код Puppet по следующей ссылке на GitHub:

SaltStack

SaltStack, также известный как Salt, это event-driven ПО с открытым исходным кодом на основе Python для автоматизации IT, удаленного выполнения задач и управления конфигурацией. Основой Salt является механизм удаленного выполнения, который создает высокоскоростную, безопасную и двунаправленную сеть связи для групп систем. Помимо этой системы связи, Salt предоставляет чрезвычайно быструю, гибкую и простую в использовании систему управления конфигурациями, называемую Salt States. Вы также должны познакомиться с такими терминами Salt, как grains, pillars и mine. К счастью, вы можете найти эту информацию на сайте с исчерпывающей документацией:

Salt — это проект с открытым исходным кодом с лицензией Apache 2.0. На страницах GitHub можно увидеть более 111 тысяч коммитов и более 2000 контрибьюторов. Вы можете найти страницу Salt на GitHub по следующему URL-адресу:

Pulumi

Pulumi — это IAC-инструмент с открытым исходным кодом для создания, развертывания и управления облачной инфраструктурой. Хотя Pulumi — самый молодой инструмент из этого списка, в последнее время он набирает огромную популярность. Самым уникальным аспектом этого инструмента является то, что вы можете написать код конфигурации на любом из следующих языков программирования: Python, Typescript, Javascript, C# или Go. Например, чтобы создать новый S3 бакет в AWS, вы можете написать код Pulumi на Python следующим образом:

Вы также можете написать код Pulumi на Javascript следующим образом.

Поскольку Pulumi можно конфигурировать на различных языках программирования, эта особенность может иметь некоторые преимущества. Во-первых, на освоение Pulumi может потребоваться меньше времени программистами, которые уже знакомы с тем или иным языком программирования. По сравнению с другими IAC-инструментами, которые требуют написания кода конфигурации в YAML или JSON, это может быть значительным преимуществом. Во-вторых, поскольку в современных языках программирования, таких как Python, Javascript и C#, уже есть условный оператор, итерирование и циклы, а также функции и методы, в код Pulumi легко встроить какой-либо расширенный функционал.

Однако с Pulumi не все так гладко. Во-первых, поскольку Pulumi построен на языках программирования, это может привести к некоторым дополнительным накладным расходам и неправильным практикам при разработке кода конфигурации для provisioning’а и управления инфраструктурой. Во-вторых, Pulumi — довольно молодой IAC-инструмент, что означает, что в течение некоторого времени поддержка и функциональность могут быть ограничены по сравнению с другими инструментами. Если вы выберете Pulumi в качестве основного IAC, будет полезно детальнее изучить  указанные выше плюсы и минусы этого инструмента.

Pulumi имеет лицензию Apache 2.0, и его файлы можно найти по следующей ссылке на GitHub:

На данный момент у него более 5900 коммитов и 109 контрибьюторов.

Как видите, существует достаточно много различных IAC-инструментов для provisioning’а и управления инфраструктурами автоматизированным способом, и этот список, скорее всего, не охватывает все существующие IAC-инструменты.


Материал подготовлен в рамках курса "Infrastructure as a code". Если вам интересно узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса — приглашаем на день открытых дверей онлайн. Регистрация здесь.