0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы рассмотрим типовой рабочий процесс с использованием Terraform без погружения в детали. Опишем небольшую инфраструктуру и поработаем с ней, развернем, обновим и удалим. А в следующих уроках, рассмотрим все это подробно.</p>
1
<p>В этом уроке мы рассмотрим типовой рабочий процесс с использованием Terraform без погружения в детали. Опишем небольшую инфраструктуру и поработаем с ней, развернем, обновим и удалим. А в следующих уроках, рассмотрим все это подробно.</p>
2
<h2>Подготовка</h2>
2
<h2>Подготовка</h2>
3
<p>На протяжении всего курса, мы будем описывать нашу инфраструктуру в репозитории, который станет частью вашего портфолио. Для этого создайте на Github репозиторий<em>hexlet-terraform</em>и клонируйте его себе на компьютер. Все дальнейшие команды будут выполняться внутри этого репозитория.</p>
3
<p>На протяжении всего курса, мы будем описывать нашу инфраструктуру в репозитории, который станет частью вашего портфолио. Для этого создайте на Github репозиторий<em>hexlet-terraform</em>и клонируйте его себе на компьютер. Все дальнейшие команды будут выполняться внутри этого репозитория.</p>
4
<p>Теперь установите Terraform по<a>этой ссылке</a>. Проверьте что он работает:</p>
4
<p>Теперь установите Terraform по<a>этой ссылке</a>. Проверьте что он работает:</p>
5
<p>Зарегистрируйтесь в<a>Yandex Cloud</a>.<a>На этой странице</a>описано как получить OAuth-токен. Сделайте запрос и получите ключ, который понадобится Terraform для выполнения удаленных команд.</p>
5
<p>Зарегистрируйтесь в<a>Yandex Cloud</a>.<a>На этой странице</a>описано как получить OAuth-токен. Сделайте запрос и получите ключ, который понадобится Terraform для выполнения удаленных команд.</p>
6
<h2>Инициализация</h2>
6
<h2>Инициализация</h2>
7
<p>Перед началом работы с Terraform, нужно определиться с облаком, которое будет использоваться. Все примеры курса даются в Yandex Cloud, но вы можете выбрать любое другое облако, которое вам по душе. Правда для этого придется самостоятельно копаться в документации, чтобы повторять за тем, что дается в уроке.</p>
7
<p>Перед началом работы с Terraform, нужно определиться с облаком, которое будет использоваться. Все примеры курса даются в Yandex Cloud, но вы можете выбрать любое другое облако, которое вам по душе. Правда для этого придется самостоятельно копаться в документации, чтобы повторять за тем, что дается в уроке.</p>
8
<p>Когда облако выбрано, нужно найти его в<a>списке провайдеров</a>и перейти в<a>документацию</a>. Либо можно посмотреть<a>документацию в самом облачном провайдере</a>. Здесь описано, как инициализировать работу с ним.</p>
8
<p>Когда облако выбрано, нужно найти его в<a>списке провайдеров</a>и перейти в<a>документацию</a>. Либо можно посмотреть<a>документацию в самом облачном провайдере</a>. Здесь описано, как инициализировать работу с ним.</p>
9
<p>Зачем нужен провайдер? Провайдер это модуль Terraform, который умеет работать с конкретным облаком. Как только он подключается к проекту, внутри появляются команды для взаимодействия с его сервисами.</p>
9
<p>Зачем нужен провайдер? Провайдер это модуль Terraform, который умеет работать с конкретным облаком. Как только он подключается к проекту, внутри появляются команды для взаимодействия с его сервисами.</p>
10
<p>Для подключения провайдера Yandex Cloud, создайте файл<em>.terraformrc</em>и добавьте в него содержимое:</p>
10
<p>Для подключения провайдера Yandex Cloud, создайте файл<em>.terraformrc</em>и добавьте в него содержимое:</p>
11
<p>Эти данные содержат информацию об источнике, и которого будет устанавливаться провайдер.</p>
11
<p>Эти данные содержат информацию об источнике, и которого будет устанавливаться провайдер.</p>
12
<p>Затем создайте файл<em>main.tf</em>и добавьте в него такое содержимое:</p>
12
<p>Затем создайте файл<em>main.tf</em>и добавьте в него такое содержимое:</p>
13
<p>Помимо указания списка провайдеров, мы описываем переменную yc_token, которая записывается в аттрибут token провайдера<em>yandex</em>. Это ключ необходим Terraform для выполнения команд по API. Значение ключа указывать в конфигурации нельзя, иначе, кто-нибудь сможет с его помощью выполнить любой код на YandexCloud, включая полное уничтожение всей инфраструктуры.</p>
13
<p>Помимо указания списка провайдеров, мы описываем переменную yc_token, которая записывается в аттрибут token провайдера<em>yandex</em>. Это ключ необходим Terraform для выполнения команд по API. Значение ключа указывать в конфигурации нельзя, иначе, кто-нибудь сможет с его помощью выполнить любой код на YandexCloud, включая полное уничтожение всей инфраструктуры.</p>
14
<p>Для работы с секретами, Terraform предлагает создавать файлы с расширением<em>*.auto.tfvars</em>, которые добавляются в<em>.gitignore</em>. Сам ключ, при этом, можно хранить в зашифрованном виде в<a>Ansible Vault</a>.</p>
14
<p>Для работы с секретами, Terraform предлагает создавать файлы с расширением<em>*.auto.tfvars</em>, которые добавляются в<em>.gitignore</em>. Сам ключ, при этом, можно хранить в зашифрованном виде в<a>Ansible Vault</a>.</p>
15
<p>Создадим файл<em>secrets.auto.tfvars</em>, в котором описываются переменные, содержащие секретные данные. Добавим туда наш ключ как значение переменной yc_token:</p>
15
<p>Создадим файл<em>secrets.auto.tfvars</em>, в котором описываются переменные, содержащие секретные данные. Добавим туда наш ключ как значение переменной yc_token:</p>
16
<p>После того как провайдер добавлен, нужно выполнить инициализацию:</p>
16
<p>После того как провайдер добавлен, нужно выполнить инициализацию:</p>
17
<p>Во время инициализации скачивается код провайдера в директорию<em>.terraform</em>. Эта служебная директория, содержимое которой нам не важно, поэтому ее добавляют в<em>.gitignore</em>.</p>
17
<p>Во время инициализации скачивается код провайдера в директорию<em>.terraform</em>. Эта служебная директория, содержимое которой нам не важно, поэтому ее добавляют в<em>.gitignore</em>.</p>
18
<p>Инициализация выполняется каждый раз, когда репозиторий клонируется заново или обновляются версии зависимостей. Несмотря на название, команда terraform init больше похожа на установку зависимостей в JavaScript с помощью npm install.</p>
18
<p>Инициализация выполняется каждый раз, когда репозиторий клонируется заново или обновляются версии зависимостей. Несмотря на название, команда terraform init больше похожа на установку зависимостей в JavaScript с помощью npm install.</p>
19
<p>Кроме<em>.terraform</em>, в директории с проектом оказывается файл<em>.terraform.lock.hcl</em>.</p>
19
<p>Кроме<em>.terraform</em>, в директории с проектом оказывается файл<em>.terraform.lock.hcl</em>.</p>
20
<h2>Описание инфраструктуры</h2>
20
<h2>Описание инфраструктуры</h2>
21
<p>На странице документации провайдера, слева меню, в котором есть список возможностей провайдера. Мы начнем с самой базовой -<a>создании сервера</a>.</p>
21
<p>На странице документации провайдера, слева меню, в котором есть список возможностей провайдера. Мы начнем с самой базовой -<a>создании сервера</a>.</p>
22
<p>В терминах Terraform<em>yandex_compute_instance</em>называется ресурсом. Это то, чем мы управляем в нашем облаке. Создадим сервер:</p>
22
<p>В терминах Terraform<em>yandex_compute_instance</em>называется ресурсом. Это то, чем мы управляем в нашем облаке. Создадим сервер:</p>
23
<p>Для создания сервера, нам пришлось создать дополнительные ресурсы<em>yandex_vpc_network</em>,<em>yandex_vpc_subnet</em>,<em>yandex_compute_disk</em>.</p>
23
<p>Для создания сервера, нам пришлось создать дополнительные ресурсы<em>yandex_vpc_network</em>,<em>yandex_vpc_subnet</em>,<em>yandex_compute_disk</em>.</p>
24
<p>Описание аргументов<em>resources</em>,<em>boot_disk</em>и других идет в документации сразу после примера в секции<em>Argument Reference</em>. Там же указано какие из них обязательные, а какие нет. С другой стороны, в этом разделе не хватает информации о возможных значениях. Откуда брать значения для<em>platform_id</em>или<em>cores</em>? Иногда в документации есть ссылка на страницу с возможными значениями, но это бывает не всегда. К сожалению здесь не остается ничего другого, как пытаться найти эту информацию в документации облачного провайдера. Здесь обычно помогает Google.</p>
24
<p>Описание аргументов<em>resources</em>,<em>boot_disk</em>и других идет в документации сразу после примера в секции<em>Argument Reference</em>. Там же указано какие из них обязательные, а какие нет. С другой стороны, в этом разделе не хватает информации о возможных значениях. Откуда брать значения для<em>platform_id</em>или<em>cores</em>? Иногда в документации есть ссылка на страницу с возможными значениями, но это бывает не всегда. К сожалению здесь не остается ничего другого, как пытаться найти эту информацию в документации облачного провайдера. Здесь обычно помогает Google.</p>
25
<p>Ресурсы требуют указания<em>folder_id</em>- это ваш каталог внутри которого будет создан ресурс. Его идентификатор можно найти<a>в консоли Yandex Cloud</a>. Если каталог не создан, создайте его.</p>
25
<p>Ресурсы требуют указания<em>folder_id</em>- это ваш каталог внутри которого будет создан ресурс. Его идентификатор можно найти<a>в консоли Yandex Cloud</a>. Если каталог не создан, создайте его.</p>
26
<p>Язык описания инфраструктуры отдаленно напоминает JSON и интуитивно понятен в большинстве ситуаций. Главное что нужно понимать, он описывает не команды, а состояние того, что мы хотим получить в конце. Это значит что порядок описания инфраструктуры не имеет значения, Terraform все равно сделает изменения в том порядке, в котором нужно.</p>
26
<p>Язык описания инфраструктуры отдаленно напоминает JSON и интуитивно понятен в большинстве ситуаций. Главное что нужно понимать, он описывает не команды, а состояние того, что мы хотим получить в конце. Это значит что порядок описания инфраструктуры не имеет значения, Terraform все равно сделает изменения в том порядке, в котором нужно.</p>
27
<p>Инфраструктуру можно описывать в любых файлах с расширением<em>*.tf</em>. Terraform самостоятельно их загружает и вычисляет порядок, в котором надо выполнять изменения. Для простоты мы все делаем в файле<em>main.tf</em>. Когда кода много, его удобно раскладывать по разным файлам.</p>
27
<p>Инфраструктуру можно описывать в любых файлах с расширением<em>*.tf</em>. Terraform самостоятельно их загружает и вычисляет порядок, в котором надо выполнять изменения. Для простоты мы все делаем в файле<em>main.tf</em>. Когда кода много, его удобно раскладывать по разным файлам.</p>
28
<h2>Создание</h2>
28
<h2>Создание</h2>
29
<p>Теперь, когда ресурсы описаны, можно их создать. Делается это в два шага. Сначала нам показывают план изменений и если он соответствует нашим ожиданиям, то мы подтверждаем его выполнение и Terraform делает это</p>
29
<p>Теперь, когда ресурсы описаны, можно их создать. Делается это в два шага. Сначала нам показывают план изменений и если он соответствует нашим ожиданиям, то мы подтверждаем его выполнение и Terraform делает это</p>
30
<p>Очень важно убедиться, что здесь нет ничего опасного, например удаление или пересоздание каких-то ресурсов, которые нельзя трогать. В этом смысле, Terraform максимально опасный инструмент. Неверно примененный план может привести к полной потере всего проекта включая бекапы.</p>
30
<p>Очень важно убедиться, что здесь нет ничего опасного, например удаление или пересоздание каких-то ресурсов, которые нельзя трогать. В этом смысле, Terraform максимально опасный инструмент. Неверно примененный план может привести к полной потере всего проекта включая бекапы.</p>
31
<p>Если нас все устраивает, то нужно набрать<em>yes</em>. Создание серверов займет какое-то время. Terraform выполняет все операции синхронно, поэтому он закончит работу только после внесения всех изменений.</p>
31
<p>Если нас все устраивает, то нужно набрать<em>yes</em>. Создание серверов займет какое-то время. Terraform выполняет все операции синхронно, поэтому он закончит работу только после внесения всех изменений.</p>
32
<p>Если все прошло успешно, то зайдите в личный кабинет Yandex Cloud и убедитесь, что сервер создан. Правда магия?</p>
32
<p>Если все прошло успешно, то зайдите в личный кабинет Yandex Cloud и убедитесь, что сервер создан. Правда магия?</p>
33
<p>После того как Terraform выполнит изменения, он создает и затем обновляет файл<em>terraform.tfstate</em>. Этот файл хранит состояние инфраструктуры на текущий момент. Зачем это нужно? С его помощью Terraform вычисляет разницу между тем, что мы хотим получить в итоге и тем что есть сейчас. Без него Terraform будет считать, что инфраструктура каждый раз создается заново. Этот файл обычно не хранят в репозитории, так как вместе с состоянием в нем могут быть чувствительные данные вроде паролей и токенов. Более того, с этим файлом в один момент времени может работать только один человек, иначе Terraform не сможет правильно оценить текущую инфраструктуру. Для этого используют специальные сервисы, которые хранят файл состояния на удаленном сервере</p>
33
<p>После того как Terraform выполнит изменения, он создает и затем обновляет файл<em>terraform.tfstate</em>. Этот файл хранит состояние инфраструктуры на текущий момент. Зачем это нужно? С его помощью Terraform вычисляет разницу между тем, что мы хотим получить в итоге и тем что есть сейчас. Без него Terraform будет считать, что инфраструктура каждый раз создается заново. Этот файл обычно не хранят в репозитории, так как вместе с состоянием в нем могут быть чувствительные данные вроде паролей и токенов. Более того, с этим файлом в один момент времени может работать только один человек, иначе Terraform не сможет правильно оценить текущую инфраструктуру. Для этого используют специальные сервисы, которые хранят файл состояния на удаленном сервере</p>
34
<p>Кроме<em>terraform.tfstate</em>Terraform создает файлы бекапы с расширением<em>*.backup</em>. Их нужно добавить в<em>.gitignore</em>.</p>
34
<p>Кроме<em>terraform.tfstate</em>Terraform создает файлы бекапы с расширением<em>*.backup</em>. Их нужно добавить в<em>.gitignore</em>.</p>
35
<p>Ну и наконец, давайте попробуем все удалить:</p>
35
<p>Ну и наконец, давайте попробуем все удалить:</p>
36
<h2>Собирая все вместе</h2>
36
<h2>Собирая все вместе</h2>
37
37