Terraform: Основы
Теория: Обзор Terraform
В этом уроке мы рассмотрим типовой рабочий процесс с использованием Terraform без погружения в детали. Опишем небольшую инфраструктуру и поработаем с ней, развернем, обновим и удалим. А в следующих уроках, рассмотрим все это подробно.
Подготовка
На протяжении всего курса, мы будем описывать нашу инфраструктуру в репозитории, который станет частью вашего портфолио. Для этого создайте на Github репозиторий hexlet-terraform и клонируйте его себе на компьютер. Все дальнейшие команды будут выполняться внутри этого репозитория.
Теперь установите Terraform по этой ссылке. Проверьте что он работает:
Зарегистрируйтесь в Yandex Cloud. На этой странице описано как получить OAuth-токен. Сделайте запрос и получите ключ, который понадобится Terraform для выполнения удаленных команд.
Инициализация
Перед началом работы с Terraform, нужно определиться с облаком, которое будет использоваться. Все примеры курса даются в Yandex Cloud, но вы можете выбрать любое другое облако, которое вам по душе. Правда для этого придется самостоятельно копаться в документации, чтобы повторять за тем, что дается в уроке.
Когда облако выбрано, нужно найти его в списке провайдеров и перейти в документацию. Либо можно посмотреть документацию в самом облачном провайдере. Здесь описано, как инициализировать работу с ним.
Зачем нужен провайдер? Провайдер это модуль Terraform, который умеет работать с конкретным облаком. Как только он подключается к проекту, внутри появляются команды для взаимодействия с его сервисами.
Для подключения провайдера Yandex Cloud, создайте файл .terraformrc и добавьте в него содержимое:
Эти данные содержат информацию об источнике, и которого будет устанавливаться провайдер.
Затем создайте файл main.tf и добавьте в него такое содержимое:
Помимо указания списка провайдеров, мы описываем переменную yc_token, которая записывается в аттрибут token провайдера yandex. Это ключ необходим Terraform для выполнения команд по API. Значение ключа указывать в конфигурации нельзя, иначе, кто-нибудь сможет с его помощью выполнить любой код на YandexCloud, включая полное уничтожение всей инфраструктуры.
Для работы с секретами, Terraform предлагает создавать файлы с расширением *.auto.tfvars, которые добавляются в .gitignore. Сам ключ, при этом, можно хранить в зашифрованном виде в Ansible Vault.
Создадим файл secrets.auto.tfvars, в котором описываются переменные, содержащие секретные данные. Добавим туда наш ключ как значение переменной yc_token:
После того как провайдер добавлен, нужно выполнить инициализацию:
Во время инициализации скачивается код провайдера в директорию .terraform. Эта служебная директория, содержимое которой нам не важно, поэтому ее добавляют в .gitignore.
Инициализация выполняется каждый раз, когда репозиторий клонируется заново или обновляются версии зависимостей. Несмотря на название, команда terraform init больше похожа на установку зависимостей в JavaScript с помощью npm install.
Кроме .terraform, в директории с проектом оказывается файл .terraform.lock.hcl.
Описание инфраструктуры
На странице документации провайдера, слева меню, в котором есть список возможностей провайдера. Мы начнем с самой базовой - создании сервера.
В терминах Terraform yandex_compute_instance называется ресурсом. Это то, чем мы управляем в нашем облаке. Создадим сервер:
Для создания сервера, нам пришлось создать дополнительные ресурсы yandex_vpc_network, yandex_vpc_subnet, yandex_compute_disk.
Описание аргументов resources, boot_disk и других идет в документации сразу после примера в секции Argument Reference. Там же указано какие из них обязательные, а какие нет. С другой стороны, в этом разделе не хватает информации о возможных значениях. Откуда брать значения для platform_id или cores? Иногда в документации есть ссылка на страницу с возможными значениями, но это бывает не всегда. К сожалению здесь не остается ничего другого, как пытаться найти эту информацию в документации облачного провайдера. Здесь обычно помогает Google.
Ресурсы требуют указания folder_id — это ваш каталог внутри которого будет создан ресурс. Его идентификатор можно найти в консоли Yandex Cloud. Если каталог не создан, создайте его.
Язык описания инфраструктуры отдаленно напоминает JSON и интуитивно понятен в большинстве ситуаций. Главное что нужно понимать, он описывает не команды, а состояние того, что мы хотим получить в конце. Это значит что порядок описания инфраструктуры не имеет значения, Terraform все равно сделает изменения в том порядке, в котором нужно.
Инфраструктуру можно описывать в любых файлах с расширением *.tf. Terraform самостоятельно их загружает и вычисляет порядок, в котором надо выполнять изменения. Для простоты мы все делаем в файле main.tf. Когда кода много, его удобно раскладывать по разным файлам.
Создание
Теперь, когда ресурсы описаны, можно их создать. Делается это в два шага. Сначала нам показывают план изменений и если он соответствует нашим ожиданиям, то мы подтверждаем его выполнение и Terraform делает это
Очень важно убедиться, что здесь нет ничего опасного, например удаление или пересоздание каких-то ресурсов, которые нельзя трогать. В этом смысле, Terraform максимально опасный инструмент. Неверно примененный план может привести к полной потере всего проекта включая бекапы.
Если нас все устраивает, то нужно набрать yes. Создание серверов займет какое-то время. Terraform выполняет все операции синхронно, поэтому он закончит работу только после внесения всех изменений.
Если все прошло успешно, то зайдите в личный кабинет Yandex Cloud �� убедитесь, что сервер создан. Правда магия?
После того как Terraform выполнит изменения, он создает и затем обновляет файл terraform.tfstate. Этот файл хранит состояние инфраструктуры на текущий момент. Зачем это нужно? С его помощью Terraform вычисляет разницу между тем, что мы хотим получить в итоге и тем что есть сейчас. Без него Terraform будет считать, что инфраструктура каждый раз создается заново. Этот файл обычно не хранят в репозитории, так как вместе с состоянием в нем могут быть чувствительные данные вроде паролей и токенов. Более того, с этим файлом в один момент времени может работать только один человек, иначе Terraform не сможет правильно оценить текущую инфраструктуру. Для этого используют специальные сервисы, которые хранят файл состояния на удаленном сервере
Кроме terraform.tfstate Terraform создает файлы бекапы с расширением *.backup. Их нужно добавить в .gitignore.
Ну и наконец, давайте попробуем все удалить:



