Автор выбрал Фонд с открытым исходным кодом в качестве получателя пожертвований в рамках программы Write for DOnations.
Введение
Terraform предлагает avanced функции, которые становятся все более полезными, по мере роста размеров и сложности вашего проекта. Возможно смягчить расходы на поддержание сложных определений инфраструктуры для нескольких средних языков, структурируя ваш код, чтобы минимизировать повторы и внедряя рабочие процессы с помощью инструментов для более простой тестирования и развертывания.
Terraform ассоциирует состояние с backend, который определяет, где и как сохраняется и извлекается состояние. Каждое состояние имеет только одну backend и связано с определением инфраструктуры. Certain backends, такие как local
или s3
, могут содержать несколько состояний. В этом случае пара состояния и инфраструктура с backend описывает рабочее пространство . Workspaces позволяют вам развернуть несколько отдельных экземпляров одной и той же конфигурации инфраструктуры без хранения их в отдельных backends.
В этом руководстве вы сначала развернете несколько экземпляров инфраструктуры с использованием различных рабочих пространств. Затем вы развернете статический ресурс, которым в этом руководстве будет DigitalOcean Volume. Наконец, вы будете использовать предотвращенные модули из реестра Terraform, чтобы дополнить собственные.
Предварительные требования
Для выполнения этого руководства вам потребуется:
- Персональный ключ доступа к DigitalOcean, который вы можете создать через контрол-панель DigitalOcean. Инструкции вы можете найти в документации DigitalOcean продукта, в разделе Как создать персональный ключ доступа.
- Terraform установлен на вашем локальном компьютере и проект с настроенным провайдером DO. Завершите Шаг 1 и Шаг 2 руководства Как использовать Terraform с DigitalOcean, и убедитесь, что имя папки проекта
terraform-advanced
, а неloadbalance
. Во время Шага 2 не добавляйте переменнойpvt_key
и ресурса SSH-ключа.
Примечание: Это руководство было тестировано специально с Terraform 1.0.2
.
Развертывание нескольких экземпляров инфраструктуры с использованием пространств
多iple workspaces are useful when you want to deploy or test a modified version of your main infrastructure without creating a separate project and setting up authentication keys again. Once you have developed and tested a feature using the separate state, you can incorporate the new code into the main workspace and possibly delete the additional state. When you init
a Terraform project, regardless of backend, Terraform creates a workspace called default
. It is always present and you can never delete it.
However, multiple workspaces are not a suitable solution for creating multiple environments, such as for staging and production. Therefore workspaces, which only track the state, do not store the code or its modifications.
Поскольку рабочие пространства не отслеживают реальный код, вам следует управлять разделением кода между несколькими рабочими пространствами на уровне управления версиями (VCS) путем сопоставления их с вариантами инфраструктуры. Как вы можете достичь этого зависит от инструмента VCS; например, в Git branches это было бы абстракцией подходящей. Чтобы легче управлять кодом для нескольких средств, вы можете разделить их на разделы, используемые в модулях, чтобы избегать повторения схожего кода для каждого средства.
Деплойм ресурсов во всех пространствах
Теперь вы создадите проект, который устанавливает Droplets, которые вы будете применять из множества рабочих пространств.
Вы сохраните определение Droplets в файле, названном droplets.tf
.
Пусть вы находитесь в каталоге terraform-advanced
, создайте и откройте его для редактирования, выполнив:
Добавьте следующие строки:
Данное определение создаст Droplets, работающие под Ubuntu 18.04 с одним ядром CPU и 1 GB RAM в регионе fra1
. Его имя будет содержать имя текущего рабочего пространства, с которого он был установлен. По завершении сохраните и закройте файл.
Примените проект Terraform, чтобы выполнить свои действия с:
Выход будет выглядеть сходно с этим:
Введите yes
, когда появится запрос на развертывание Droplet в рабочем пространстве default
.
Имя Droplet будет web-default
, поскольку рабочее пространство, с которого вы начали, называется default
. Вы можете список рабочих пространств, чтобы подтвердить, что оно является единственным доступным:
Выход будет выглядеть сходно с этим:
Output* default
Звезда (*
) означает, что в настоящее время вы выбрали это рабочее пространство.
Создайте и перейдите к новому рабочему пространству с именем testing
, которое вы будете использовать для развертывания другого Droplet, выполняя команду workspace new
:
Выход будет выглядеть сходно с этим:
OutputCreated and switched to workspace "testing"!
You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.
Планируйте развертывание Droplet снова, выполняя:
Выход будет схож с предыдущим запуском:
OutputTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# digitalocean_droplet.web будет создан
+ resource "digitalocean_droplet" "web" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ id = (known after apply)
+ image = "ubuntu-18-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ ipv6_address_private = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "web-testing"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = (known after apply)
+ region = "fra1"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ status = (known after apply)
+ urn = (known after apply)
+ vcpus = (known after apply)
+ volume_ids = (known after apply)
+ vpc_uuid = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
...
Обратите внимание, что Terraform планирует развернуть Droplet с именем web-testing
, который он назвал по-разному, чем web-default
. Это because default
и testing
рабочие пространства имеют отдельные состояния и не знают о ресурсах друг друга, даже если они происходят из одного кода.
Для проверки, что вы находитесь в рабочем пространстве testing
, выведите текущее рабочее пространство с помощью команды workspace show
:
Выход будет именем текущего рабочего пространства:
Outputtesting
Для удаления рабочей области сначала необходимо уничтожить все развернутые ресурсы. Затем, если она активна, нужно переключиться на другую, используя workspace select
. Так как рабочая область testing
здесь пуста, вы можете сразу переключиться на default
:
Вы получите подтверждение переключения от Terraform:
OutputSwitched to workspace "default".
Затем вы можете удалить её, выполнив workspace delete
:
Terraform выполнит удаление:
OutputDeleted workspace "testing"!
Вы можете уничтожить Droplet, развернутый в рабочей области default
, выполнив:
Введите yes
, когда вас попросят завершить процесс.
В этом разделе вы работали в нескольких рабочих областях Terraform. В следующем разделе вы развернете ресурс с состоянием.
Развертывание ресурсов с состоянием
Ресурсы без состояния не хранят данных, поэтому их можно быстро создавать и заменять, так как они не уникальны. Ресурсы с состоянием, с другой стороны, содержат уникальные данные или данные, которые нельзя просто восстановить; поэтому им требуется постоянное хранение данных.
Так как вы можете в конечном итоге уничтожить такие ресурсы или несколько ресурсов потребуют их данных, лучше всего хранить их в отдельном объекте, таком как DigitalOcean Volumes.
Volumes обеспечивают дополнительное место для хранения. Они могут быть присоединены к Дроплетам (серверам), но являются отдельными от них. В этом шаге вы определите Volume и подключите его к Дроплету в `droplets.tf`.
Откройте его для редактирования:
Добавьте следующие строки:
В этом месте вы определяете два новых ресурса, сам Volume и присоединение Volume. Volume будет 10GB, форматированным как `ext4`, называться `new-volume` и находиться в том же регионе, что и Дроплет. Так как Volume и Дроплет являются отдельными сущностями, вам нужно определить объект присоединения Volume, чтобы соединить их. `volume_attachment` принимает ID Дроплета и Volume и дает указание облаку DigitalOcean сделать Volume доступным для Дроплета как дисковое устройство.
Когда вы это закончите, сохраните и закройте файл.
Планируйте эту конфигурацию с помощью:
Действия, которыеTerraform планирует будут следующие:
Детали вывода, которые Terraform создаст Дроплет, Volume и присоединение Volume, которое соединяет Volume с Дроплетом.
Теперь вы определили и подключили Volume (statful ресурс) к Дроплету. В следующем разделе вы увидите готовые Terraform модули, которые вы можете использовать в вашем проекте.
Ссылка на готовые модули
Кроме создания своих собственных customs модулей для ваших проектов, вы также можете использовать готовые модули и провайдеры других разработчиков, которые доступны для всех в Терраформ регистре.
В разделе модулей вы можете искать базу данных доступных модулей и сортировать по провайдеру, чтобы найти модуль с необходимой вам функциональностью. После того, как вы найдете его, вы можете прочитать его описание, которое указывает на входные и выходные данные, которые модуль предоставляет, а также на внешние модули и зависимости провайдера.
Теперь вы добавите модуль SSH ключа DigitalOcean в ваш проект. Вы будете хранить код отдельно от существующих определений в файле, названном ssh-key.tf
. Создайте и откройте его для редактирования, запустив:
Добавьте следующие строки:
Этот код определяет экземпляр модуля clouddrove/droplet/digitalocean
из реестра и устанавливает некоторые из параметров, которые он предлагает. Он должен добавить общедоступный SSH-ключ в ваш аккаунт, прочитав его из ~/.ssh/id_rsa.pub
.
После завершения сохраните и закройте файл.
Перед тем как выполнить команду plan
для этого кода, вам необходимо загрузить упомянутый модуль, выполнив:
Вы получите вывод, аналогичный следующему:
OutputInitializing modules...
Downloading clouddrove/ssh-key/digitalocean 0.13.0 for ssh-key...
- ssh-key in .terraform/modules/ssh-key
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of digitalocean/digitalocean from the dependency lock file
- Using previously-installed digitalocean/digitalocean v2.10.1
Terraform has been successfully initialized!
...
Теперь вы можете спланировать код для внесения изменений:
Вы получите вывод, аналогичный этому:
Вывод показывает, что вы создадите ресурс SSH-ключа, что означает, что вы загрузили и вызвали модуль из вашего кода.
Заключение
Более крупные проекты могут воспользоваться一些 продвинутыми функциями, которые предлагает Terraform, чтобы снизить сложность и упростить поддержку. Рабочие пространства позволяют вам тестировать новые добавления в вашем коде, не затрагивая стабильные основные развертывания. Вы также можете объединить рабочие пространства с системой контроля версий для отслеживания изменений в коде. Использование готовых модулей также может сократить время разработки, но в будущем это может привести к дополнительным расходам или времени, если модуль станет устаревшим.
Руководство является частью серии Как управлять инфраструктурой с Terraform . Сérie охватывает ряд тем Terraform, от установки Terraform впервые до управления сложными проектами.