• Глава 5 «Работа с Terraform: циклы, условные выражения, развертывание и подводные камни». Циклы с параметром count, выражения for_each и for, строковая директива for; условный оператор с параметром count, выражениями for_each и for, строковой директивой if; встроенные функции; развертывание с нулевым временем простоя; часто встречающиеся подводные камни, связанные с ограничениями count и for_each, развертываниями без простоя; как хорошие планы могут провалиться, проблемы с рефакторингом и отложенная согласованность.
• Глава 6 «Код Terraform промышленного уровня». Почему проекты DevOps всегда развертываются дольше, чем ожидается; что характеризует инфраструктуру, готовую к промышленному использованию; как создавать модули Terraform для промышленных условий; готовые к выпуску модули; реестр модулей Terraform; «аварийные люки» в Terraform.
• Глава 7 «Как тестировать код Terraform». Ручное тестирование кода Terraform; тестовые среды и очистка; автоматизированное тестирование кода Terraform; Terrarest; модульные тесты; интеграционные тесты; сквозные тесты; внедрение зависимостей; параллельное выполнение тестов; этапы тестирования; пирамида тестирования; статический анализ; проверка свойств.
•Глава 8 «Как использовать Terraform в команде». Как внедрить Terraform в командную работу; как убедить начальство; рабочий процесс развертывания кода приложения; рабочий процесс развертывания инфраструктурного кода; управление версиями; золотое правило Terraform; разбор кода; рекомендации по оформлению кода; принятый в Terraform стиль; CI/CD для Terraform; процесс развертывания.
Эту книгу можно читать последовательно или сразу переходить к тем главам, которые вас больше всего интересуют. Имейте в виду, что все примеры последующих глав основаны на коде из предыдущих. Если вы листаете туда-сюда, используйте в качестве ориентира архив исходного кода (как описано в разделе «Примеры с открытым исходным кодом» далее). В приложении вы найдете список книг и статей о Terraform, системном администрировании, IaC и DevOps.
Что нового во втором издании
Первое издание вышло в 2017 году. В мае 2019-го я готовил второе издание и был очень удивлен тому, как все изменилось за пару лет! Эта книга по своему объему почти в два раза превосходит предыдущую и включает две полностью новые главы. Кроме того, существенно обновлены все оригинальные главы и примеры кода.
Если вы уже прочитали первое издание и хотите узнать, что изменилось, или вам просто интересно посмотреть, как эволюционировал проект Terraform, вот несколько основных моментов.
•Четыре крупных обновления Terraform. Когда вышла первая книга, стабильной версией Terraform была 0.8. Спустя четыре крупных обновления Terraform имеет версию 0.12. За это время появились некоторые поразительные новшества, о которых пойдет речь далее. Чтобы обновиться, пользователям придется попотеть!1
• Улучшения в автоматическом тестировании. Существенно эволюционировали методики и инструментарий написания автоматических тестов для кода Terraform. Тестированию посвящена новая глава, седьмая, которая затрагивает такие темы, как модульные, интеграционные и сквозные тесты, внедрение зависимостей, распараллеливание тестов, статический анализ и др.
• Улучшения в модулях. Инструментарий и методики создания модулей Terraform тоже заметно эволюционировали. В новой, шестой, главе вы найдете руководство по написанию испытанных модулей промышленного уровня с возможностью повторного использования — таких, которым можно доверить благополучие своей компании.
• Улучшения в рабочем процессе. Глава 8 была полностью переписана согласно тем изменениям, которые произошли в процедуре интеграции Terraform в рабочий процесс команд. Там, помимо прочего, можно найти подробное руководство о том, как провести прикладной и инфраструктурный код через все основные этапы: разработку, тестирование и развертывание в промышленной среде.
• HCL2. В Terraform 0.12 внутренний язык HCL обновился до HCL2. Это включает в себя поддержку полноценных выражений (чтобы вам не приходилось заворачивать все в ${…}!), развитые ограничители типов, условные выражения с отложенным вычислением, поддержку выражений null, for_each и for, вложенные блоки и др. Все примеры кода в этой книге были адаптированы для HCL2, а новые возможности языка подробно рассматриваются в главах 5 и 6.
• Переработанные механизмы хранения состояния. В Terraform 0.9 появилась концепция внутренних хранилищ. Это полноценный механизм хранения и разделения состояния Terraform со встроенной поддержкой блокирования. В Terraform 0.9 также были представлены окружения состояния, которые позволяют управлять развертываниями в разных средах; но уже в версии 0.10 им на смену пришли рабочие области. Все эти темы рассматриваются в главе 3.
• Вынос провайдеров из ядра Terraform. В Terraform 0.10 из ядра был вынесен код для всех провайдеров (то есть код для AWS, GCP, Azure и т. д.). Благодаря этому разработка провайдеров теперь ведется в отдельных репозиториях, в своем собственном темпе и с выпуском независимых версий. Однако теперь придется загружать код провайдера с помощью команды terraforminit каждый раз, когда вы начинаете работать с новым модулем. Об этом пойдет речь в главах 2 и 7.
• Большое количество новых провайдеров. В 2016 году проект Terraform официально поддерживал лишь несколько основных облачных провайдеров (AWS, GCP и Azure). Сейчас же их количество превысило 100, а провайдеров, разрабатываемых сообществом, и того больше2. Благодаря этому вы можете использовать код для работы не только с множеством разных облаков (например, теперь существуют провайдеры для Alicloud, Oracle Cloud Infrastructure, VMware vSphere и др.), но и с другими аспектами окружающего мира, включая системы управления версиями (GitHub, GitLab или BitBucket), хранилища данных (MySQL, PostreSQL или InfluxDB), системы мониторинга и оповещения (включая DataDog, New Relic или Grafana), платформы наподобие Kubernetes, Helm, Heroku, Rundeck или Rightscale и многое другое. Более того, сейчас у каждого провайдера намного лучше покрытие: скажем, провайдер для AWS охватывает большинство сервисов этой платформы, а поддержка новых сервисов часто появляется даже раньше, чем у CloudFormation!
• Реестр модулей Terraform. В 2017 году компания HashiCorp представила реестр модулей Terraform (registry.terraform.io) — пользовательский интерфейс, который облегчает просмотр и загрузку открытых универсальных модулей Terraform, разрабатываемых сообществом. В 2018 году была добавлена возможность запускать внутри своей организации закрытый реестр. В Terraform 0.11 появился полноценный синтаксис для загрузки модулей из реестра. Подробнее об этом читайте в разделе «Управление версиями» на с. 153.
• Улучшенная обработка ошибок. В Terraform 0.9 обновилась обработка ошибок состояния: если при записи состояния в удаленное хранилище обнаруживается ошибка, это состояние сохраняется локально, в файле errored.tfstate. В Terraform 0.12 механизм был полностью переработан. Теперь ошибки перехватываются раньше, а сообщения о них стали более понятными и содержат путь к файлу, номер строчки и фрагмент кода.
• Много других мелких изменений. Было сделано много менее значительных изменений, включая появление локальных переменных (см. раздел «Локальные переменные модулей» на с. 144), новые «аварийные люки» для взаимодействия с внешним миром с помощью скриптов (например, подраздел «Модули вне Terraform» на с. 242), выполнение plan в рамках команды apply (см. раздел «Развертывание одного сервера» на с. 64), исправление циклических проблем с create_before_destroy, значительное улучшение параметра count, которое позволяет ссылаться в нем на источники данных и ресурсы (см. раздел «Циклы» на с. 160), десятки новых встроенных функций, обновленное наследование provider и многое другое.
Чего нет в этой книге
Книга не задумывалась как исчерпывающее руководство по Terraform. Она не охватывает все облачные провайдеры, все ресурсы, которые поддерживаются каждым из них, или каждую команду, доступную в этой системе. За этими подробностями я отсылаю вас к документации по адресу https://www.terraform.io/docs/index.html.
Документация содержит множество полезной информации, но, если вы только знакомитесь с Terraform, концепцией «инфраструктура как код» или системным администрированием, вы попросту не знаете, какие вопросы задавать. Поэтому данная книга сосредоточена на том, чего нет в документации: как выйти за рамки вводных примеров и начать использовать Terraform в реальных условиях. Моя цель — быстро подготовить вас к работе с данной системой. Для этого мы обсудим, зачем вообще может понадобиться Terraform, как внедрить этот инструмент в рабочий процесс и какие методики и шаблоны проектирования обычно работают лучше всего.
Чтобы это продемонстрировать, я включил в книгу ряд примеров кода. Я пытался сделать так, чтобы вам было просто работать с ними в домашних условиях. Для этого минимизировал количество сторонних зависимостей. Именно поэтому везде используется лишь один облачный провайдер, AWS. Таким образом, вам нужно будет зарегистрироваться только в одном стороннем сервисе (к тому же AWS предлагает хороший бесплатный тариф, поэтому не придется ничего платить за выполнение примеров).
Примеры с открытым исходным кодом
Все доступные в этой книге примеры кода можно найти по адресу github.com/brikis98/terraform-up-and-running-code.
Перед чтением можете скопировать репозиторий, чтобы иметь возможность выполнять примеры на своем компьютере:
git clone https://github.com/brikis98/terraform-up-and-running-code.git
Примеры кода в этом репозитории разбиты по главам. Стоит отметить, что большинство из них демонстрирует состояние кода на момент завершения главы. Если вы хотите научиться как можно большему, весь код лучше писать самостоятельно, с нуля.