Интродукция
Структурирование проектов при помощи Terraform в соответствии с их использованием и представленной сложностью является важностью для обеспечения их поддерживаемости и расширяемости во время работы. Необходимо принимать системную методику организации файлов кода, чтобы проект остался масштабируемым при развертывании и был доступным для вас и вашей команды.
В этой статье вы узнают о структурировании проектов при помощи Terraform в соответствии с их общей направленностью и сложностью. Затем вы создадите проект с простой структурой используя более часто использующие функции Terraform: переменные, локалы, источники данных и предоставлятели. В конце ваш проект будет развертывать сервер Ubuntu 20.04 на DigitalOcean, установить веб-сервер Apache, а также привязать ваш домен к веб-серверу.
Преrequisitos
-
Как создать персональный токен доступа DigitalOcean, который можно получить через панель управления DigitalOcean. Поиск инструкций можно найти в документах DigitalOcean по продукту, How to Create a Personal Access Token.
-
Шейк для SSH без пароля, добавленный к вашему аккаунту DigitalOcean, который можно создать последовательно по примеру Как использовать SSH ключи с DigitalOcean Droplet.
-
Terraform установлен на ваш компьютер. По инструкциям по вашему операционному систему читайте Шаг 1 из Терраформа: как использовать DigitalOcean.
-
Python 3 установлен на вашем локальном компьютере. Вы можете выполнить шаг 1 из Руководства по установке и настройке локальной программной среды для Python 3 для вашего операционной системы.
-
Полностью зарегистрированное доменное имя было добавлено в вашу учетную запись DigitalOcean. Чтобы получить инструкции по тому, как это сделать, посетите официальные документы.
Примечание: Это руководство особенно испытано с Terraform 1.0.2
.
Понимание структуры проекта Terraform
На этой странице вы узнаваете о том, что принимает в свои рабочие проекты Terraform, как можно структурировать код инфраструктуры и почему вы должны выбирать определенную методику. Вы также получают информацию о рабочих пространствах Terraform, что они делают, а также как Terraform хранит статус.
Существующий ресурс – это энtity облачной службы (например, DigitalOcean Droplets), который определен в коде Terraform с условиями задачи и принятыми изолированными свойствами. Многие ресурсы образуют инфраструктуру с их взаимосвязанными соединениями.Инфраструктура представляет собой систему, которая состоит из множества ресурсов, которые создаются по установленным и полученным свойствам. Многократные ресурсы составляют инфраструктуру своими международными отношениями.
Терраформ использует специальный язык программирования для определения инфраструктуры, называемый Нашикорп Конфигурационный ЛаANGUАГЕ. Код Терраформа хранится в файлах с расширением tf
. Проект Терраформа — любой директория, которая содержит файлы tf
и была инициализирована командой init
, которая установила кэшы Терраформа и по умолчанию локальную статус.
Терраформ отслеживает статус инфраструктуры, который используется для того, чтобы поддержать надёжность и ре redundancy во время развертывания. Статус хранится в бэкендах (на диск или в облачном услуге хранения файлов или специализированной системе управления статусом). Вы можете получить более подробную информацию о различных бэкендах в документации Терраформа.
Проект рабочих пространств позволяет вам иметь несколько состояний в одном бэкенде, связанных с тем же конфигурацией. Это позволяет выпустить множество различных примеров той же инфраSTRУКЦИИ. Каждый проект начинается с рабочим пространством, которое называется default
. Если вы не создали или не переключились к другому, то будет использоваться этот случай.
Модули в Terraform (аксиоматика библиотек во временной программировании) являются параметризованными конTAINERы кода, которые заключают многообразие деклараций ресурсов. Они позволяют отстранить общий часть инфраSTRУКЦИИ и использовать её позже с различными входами.
АTerraform может также включать файлы внешних кодов для использования с динамическими данными ввода, которые парсит JSON-ответ команды CLI и предлагают его для использования в декларациях ресурсов. В этом уроке вы это будете делать с Python-скриптом.
Сознавая, что такое проект Terraform, давайте рассмотрим две общепринятые подходы к структурированию проектов Terraform.
Простой структуры
Простая структура подходит для небольших и тестовых проектов, в которых есть несколько ресурсов различных типов и переменных. У нее несколько конфигурационных файлов, обычно один на тип ресурса (или более помощников вместе с основным), и никаких customs модулей, поскольку большинство ресурсов уникальны и не хватает, чтобы быть общей и использоваться повторно. В следующем идет большинство кода в том же каталоге, рядом друг с другом. Эти проекты часто содержат несколько переменных (таких как ключ API для доступа к облаку) и могут использовать динамические данные ввода и другие возможности Terraform и HCL, хотя и не на первом месте.
Как пример структуры файлов этого подхода, так это, каким проект, который вы будете строить в этом учебнике, будет выглядеть в конце:
.
└── tf/
├── versions.tf
├── variables.tf
├── provider.tf
├── droplets.tf
├── dns.tf
├── data-sources.tf
└── external/
└── name-generator.py
Поскольку этот проект будет развернувать сервер Apache Droplet и устанавливать записи DNS, определения переменных проекта, провайдера Terraform DigitalOcean, Droplet и записей DNS будут сохранены в соответствующих файлах. Минимально необходимые версии Terraform и провайдера DigitalOcean будут определены в versions.tf
, а Python-скрипт, который будет генерировать имя для Droplet (и использоваться как динамический источник данных в data-sources.tf
), будет сохранен в каталоге external
, чтобы отделить его от кода HCL.
Complex Structure
В отличие от простой структуры, этот подход соответствует более крупным проектам, включающим ясно определенные структуры подкаталогов с множеством модулей различной сложности, кроме обычного кода. Эти модули могут взаимозависеть. Благодаря включению системы управления версиями, эти проекты могут широко использовать рабочие пространства. Этот подход подходит для крупных проектов, управляющих несколькими приложениями, в том числе повторно используя код.
Instance разработки, стадии предпродаж, качественной проверки и производственной инфраструктуры также могут находиться в одном и том же проекте под различными каталогами за счет общей зависимости от модулей, тем самым устраняя дублирование кода и делая проект центральным источником правды. Вот структура файлов примера проекта с более сложной структурой, содержащего множество приложений для развертывания, модулей Terraform и целевых облачных средств:
.
└── tf/
├── modules/
│ ├── network/
│ │ ├── main.tf
│ │ ├── dns.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ └── spaces/
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── applications/
├── backend-app/
│ ├── env/
│ │ ├── dev.tfvars
│ │ ├── staging.tfvars
│ │ ├── qa.tfvars
│ │ └── production.tfvars
│ └── main.tf
└── frontend-app/
├── env/
│ ├── dev.tfvars
│ ├── staging.tfvars
│ ├── qa.tfvars
│ └── production.tfvars
└── main.tf
Этот подход рассматривается в более подробной серии Как управлять инфраструктурой с Terraform.
Теперь вы узнали, что такое проект Terraform, как лучше структурировать его согласно предполагаемой сложности и какова роль рабочих пространств Terraform. В следующих шагах вы создадете проект с простой структурой, который предоставит Droplet с установленным Apache web server и установленными DNS записями для вашего домена. Вы сначала инициализируете свой проект с поставщиком DigitalOcean и переменными, а затем продолжите определять Droplet, динамический источник данных для предоставления его имени, и DNS запись для развертывания.
Шаг 1 — настройка вашего первого проекта
В этом разделе вы добавите провайдер DigitalOcean Terraform в ваш проект, определите переменные проекта и объявите экземпляр провайдера DigitalOcean, чтобы Terraform смог подключиться к вашему аккаунту.
Начните создание каталога для вашего проекта Terraform следующим законом:
Перейдите в него:
Так как этот проект будет использовать простую структуру, вы будете хранить код провайдера, переменные, Droplet и запись DNS в отдельных файлах, согласно структуре файлов из предыдущего раздела. Сначала вам нужно добавить провайдера DigitalOcean Terraform в ваш проект как обязательного провайдера.
Создайте файл с именем versions.tf
и откройте его для редактирования, выполнив следующий запрос:
Добавьте следующие строки:
В этом блоке terraform
вы перечисляете обязательные провайдеры (DigitalOcean, версия 2.x
). После завершения сохраните и закройте файл.
Тогда define the variables your project will expose in the variables.tf
file, following the approach of storing different resource types in separate code files:
Добавьте следующие переменные:
Сохраните и закройте файл.
Переменная do_token
будет содержать ваш токен доступа персонального аккаунта DigitalOcean, а domain_name
будет указывать на ваш желаемый домен. Запущенный Droplett будет автоматически установлен SSH-ключ, идентифицированный по отпечатку SSH.
Далее мы определим экземпляр провайдера DigitalOcean для этого проекта. Вы сохраните его в файле с именем provider.tf
. Создайте и откройте его для редактирования, запустив:
Добавьте провайдера:
Сохраните и выйдите, когда вы закончите. Вы определили провайдера digitalocean
, который соответствует необходимому вам провайдеру, указанному ранее в provider.tf
, и установили его токен значением переменной, которое будет предоставлено во времяRuntime.
В этом шаге вы создали directory для вашего проекта, запросили, чтобы провайдер DigitalOcean был доступен, объявили переменные проекта и настроили соединение с экземпляром провайдера DigitalOcean, используя токен аутентификации, который будет предоставлен позже. Теперь вы начнете писать скрипт, который будет генерировать динамические данные для определений вашего проекта.
Шаг 2 — Создание Python-скрипта для динамических данных
Перед тем, как перейти к определению Droplet, вы создадите Python скрипт, который будет генерировать имя Droplet динамически и объявить ресурс источника данных для его анализа. Имя будет генерироваться путем конкатенации непременного строки (web
) с текущим временем локального компьютера, выраженным в формате UNIX эпохи. Скрипт для названия может быть полезен, когда создается несколько Droplet в соответствии с названием, для удобного их различения.
Вы сохраните скрипт в файле с именем name-generator.py
в каталоге с именем external
. Сначала создайте каталог, запустив:
Каталог external
находится в корне вашего проекта и будет хранить файлы, не содержащие HCL кода, например, Python скрипт, который вы напишете.
Создайте name-generator.py
в external
и откройте его для редактирования:
Добавьте следующий код:
Этот Python скрипт импортирует модули json
и time
, объявляет словарь с именем result
и устанавливает значение ключа name
в переменную, которая объединяет fixed_name
с текущим UNIX временем машины, на которой он запущен. Затем result
преобразуется в JSON и выводится на stdout
. Вывод будет различным каждый раз, когда скрипт запускается:
Когда вы завершите работу, сохраните и закрыть файл.
Примечание: Большие и сложные структурные проекты требуют более подробного рассмотрения как создаются и используются источники данных, особенно в отношении переносимости и обработки ошибок. Терраформexpects выполняемый программы писать человечески readable ошибочную информацию на stderr
и принимать конечность с неотрицательным статусом, что ниже показанно в этой шаге из-за простоты задачи. Кроме того, он expecte программу иметь ни одной сторонней воздействия, так что можно использовать его любые числа раз.
Для получения более подробной информы о том, чтоTerraformexpects от источников данных, посетите официальные документы.
Теперь, когда сript готов, вы можете definir источник данных, который будет получать данные из сript. Вы должны создать файл data-sources.tf
в корне вашего проекта согласно простейшему подходу к организации.
Создайте его для редактирования командой:
Добавить следующий дефиниция:
Сохраните и закрыть файл.
Этот источник данных называется droplet_name
и использует Python 3, который расположен в директории external
, которой вы just создали. Он автоматически парсит свой вывод и предоставляет deserializec data под свойство result
для использования во всех других дефинициях ресурсов.
Соответственно теперь вы можете definir Droplet, на котором будет работать Apache.
Шаг 3 — Определение размера
В этой стадии вы будете писать определение размера и сохранять его в файл кода, который относится к размеру, как положено при использовании простого подхода. Имя будет получено из источника данных, который был создан ранее, и будет различаться при каждом развертывании. Создайте и откройте файл droplets.tf
для редактирования:
Создайте и откройте файл droplets.tf
для редактирования:
Добавить следующий размер ресурса размера:
Вы первым объявляете ресурс SSH-ключа DigitalOcean, который будет получен из вашего аккаунта по имени. Убедитесь, что вы заменяют выделенную часть кода на своём имеем SSH-ключа.
Затем вы объявляете ресурс размера, называемый web
. Его настоящее имя в облаке будет другим, так как оно получается из источника данных droplet_name
. Чтобы во время развертывания размера приложить к нему SSH-ключ, идентификатор ssh_key
передается в параметр ssh_keys
, так что DigitalOcean знает, какой ключ приложить.
На сегодняшний момент это все, что нужно конфигурировать в отношении размера droplet.tf
, поэтому сохраните и закрыть файл, когда вы закончите.
Теперь вы напишите конфигурацию для DNS-реcord, который будет указывать ваш домен на только что объявленный размер.
Шаг 4 —Defining DNS Records
Последним шагом процесса является конфигурация DNS-реcord, который указывает на Dropleт из вашего домена.
Вы сохраните конфигурацию DNS в файле, который называется dns.tf
, поскольку это отдельный тип ресурсов от других, которые вы создали в предыдущих шагах. Создайте и откройте его для редактирования:
Добавить следующие строки:
Этот код объявляет DigitalOcean DNS-реcord на ваш домен (используется переменная), типа A
. Рекорд имеет имя @
, которое является местоположением самого домена и значением его valuel
. Вы можете заменить значение name
на что-либо другое, что приведет к созданию поддомена.
Когда вы завершили, сохраните и закрыть файл.
Теперь, после того как вы конфигурировали Dropleт, источник данных для генерации случайных чисел, и DNS-реcord, вы перейдете к развертыванию проекта в облаке.
Шаг 5 — Планирование и Применение конфигурации
На этой странице вы будете инициализировать ваш проект Terraform, развертывать его в облаке и проверить, что все было примененноcorrectly.
Сегодняшним шагом вы должны начать работу с вашим проектом Terraform, развернуть его в облаке и проверить, что все было примененноcorrectly.
Для начала вы должны выполнить следующий команду:
OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Finding latest version of hashicorp/external...
- Installing digitalocean/digitalocean v2.10.1...
- Installed digitalocean/digitalocean v2.10.1 (signed by a HashiCorp partner, key ID F82037E524B9C0E8)
- Installing hashicorp/external v2.1.0...
- Installed hashicorp/external v2.1.0 (signed by HashiCorp)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Вы получите следующий вывод:
Теперь вы можете развернуть ваш Droptlet с динамическим названием и соответствующим доменом в вашем аккаунте DigitalOcean.
Начать сdefine имени домена, фingerprint SSH ключа и ваш личный токен доступа, чтобы не приходилось копировать значения каждый раз, когда вы используете Terraform. Выполните следующие команды, заменив подlined values:
Вы можете найти свой API-токен в панели управления DigitalOcean.
Используйте следующие команды, передавая значения переменных окружения:
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:
Запустите команду plan
с переданными значениями, чтобы видеть, какие действия Terraform будет предпринимать для развертывания вашего проекта:
+ resource "digitalocean_droplet" "web" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ id = (known after apply)
+ image = "ubuntu-20-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "web-1625908814"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = (known after apply)
+ region = "fra1"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ ssh_keys = [
+ "...",
]
+ status = (known after apply)
+ urn = (known after apply)
+ vcpus = (known after apply)
+ volume_ids = (known after apply)
+ vpc_uuid = (known after apply)
}
Ответ будет похожим на следующий:
+ resource "digitalocean_record" "www" {
+ domain = "your_domain'"
+ fqdn = (known after apply)
+ id = (known after apply)
+ name = "@"
+ ttl = (known after apply)
+ type = "A"
+ value = (known after apply)
}
Plan: 2 to add, 0 to change, 0 to destroy.
...
# digitalocean_droplet.web will be created
# digitalocean_record.www will be created
OutputPlan: 2 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: `yes`
Как и раньше, строки, начавшиеся с зеленых символов +
, означают, что Terraform будет создать каждый из ресурсов, который последовал после них после применения конфигурации:yes
, и Terraform будет развернуть ваш Droptlet и записать DNS-реcord:
Outputdigitalocean_droplet.web: Creating...
...
digitalocean_droplet.web: Creation complete after 33s [id=204432105]
digitalocean_record.www: Creating...
digitalocean_record.www: Creation complete after 1s [id=110657456]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Terraform теперь зарегистрировал развернутые ресурсы в своем состоянии. Чтобы подтвердить успешное соединение DNS-записей с Droplet, вы можете извлечь IP-адрес Droplet из локального состояния и проверить, соответствует ли он общедоступным DNS-записям для вашего домена. Введите следующий коммандд, чтобы получить IP-адрес:
Вы получите IP-адрес вашего Droplet:
Outputipv4_address = "your_Droplet_IP"
...
Вы можете проверить общедоступные A-записи, запустив:
Выход будет показывать IP-адрес, к которому указывает A-запись:
OutputAddress: your_Droplet_IP
Они совпадают, как и должны, что意味着 Droplet и DNS-запись были успешно настроены.
Для того, чтобы изменения в следующем шаге были выполнены, удалите развернутые ресурсы, запустив:
Когда вам будет предложено, введите yes
, чтобы продолжить.
В этом шаге вы создали свою инфраструктуру и применили ее к вашему счету DigitalOcean. Теперь вы измените ее, чтобы Terraform провайдеры автоматически устанавливали Apache HTTP-сервер на уже настроенном Droplet.
Шаг 6 — Execution of Code Using Provisioners
Теперь вы настроите установку Apache HTTP-сервера на вашем развернутом Droplet с использованием провайдера remote-exec
для выполнения пользовательских команд.
Провизоnersы могут использоваться для выполнения определенных действий над созданными удаленными ресурсами (провизоner remote-exec
) или на локальной машине, на которой выполняется код (используя провизоner local-exec
). Если провизоNER не успешен, то узл будет помечен как отравленный в текущем состоянии, что значит, что он будет удален и пересоздан при следующих запусках.
Чтобы подключиться к провизоNERу Droplet, Terraform необходимо иметь привязку частного ключа SSH Droplet. Лучше всего это сделать через переменные, поэтому открый файл variables.tf
для редактирования:
Добавьте выделенную строку:
Вы теперь добавили новую переменную, называемую private_key
, к вашему проекту. Сохраните и закрыть файл.
Следующий шаг состоит в добавлении данных для подключения и объявления провизоNERов для Droplet в конфигурации. Открой droplets.tf
для редактирования командой:
Расширьте существующий код с выделенными линиями:
Блок connection
указывает как Terraform должен обращаться к целевому Droplet. Блок provisioner
содержит массив команд, которые будут выполнены после провизоNERа, то есть обновление缓存 пакетов и установка Apache. Сохраните и выйдите, когда вы закончите.
Также можно создать временную переменную окружения для пути к частному ключу:
Примечание: Private key, а также любой другой файл, который вы хотите загрузить внутри Terraform, должны быть размещены внутри проекта. Для получения более подробной информации о установке SSH-ключа на сервере Linux обратитесь к руководству How To Configure SSH Key-Based Authentication on a Linux Server о процедуре установки SSH-ключа на Ubuntu 20.04 или других дистрибутивах.
Попробуйте применить конфигурацию снова:
Введите yes
, когда появится запрос. Вы получите выходной файл, схожий с предыдущим, но следующий за ним будет длинный вывод провайдера remote-exec
:
Outputdigitalocean_droplet.web: Creating...
digitalocean_droplet.web: Still creating... [10s elapsed]
digitalocean_droplet.web: Still creating... [20s elapsed]
digitalocean_droplet.web: Still creating... [30s elapsed]
digitalocean_droplet.web: Provisioning with 'remote-exec'...
digitalocean_droplet.web (remote-exec): Connecting to remote host via SSH...
digitalocean_droplet.web (remote-exec): Host: ...
digitalocean_droplet.web (remote-exec): User: root
digitalocean_droplet.web (remote-exec): Password: false
digitalocean_droplet.web (remote-exec): Private key: true
digitalocean_droplet.web (remote-exec): Certificate: false
digitalocean_droplet.web (remote-exec): SSH Agent: false
digitalocean_droplet.web (remote-exec): Checking Host Key: false
digitalocean_droplet.web (remote-exec): Connected!
...
digitalocean_droplet.web: Creation complete after 1m5s [id=204442200]
digitalocean_record.www: Creating...
digitalocean_record.www: Creation complete after 1s [id=110666268]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Теперь вы можете перейти к вашему домену в web-браузере. Вы увидите стандартную страницу приветствия Apache.
Это означает, что Apache был успешно установлен, и что Terraform правильно произвела провизию.
Для удаления установленных ресурсов выполните следующий запрос и введите yes
, когда появится запрос:
Теперь вы завершили небольшой проект Terraform с простым строением, который устанавливает веб-сервер Apache на Droplet и настраивает DNS-записи для желаемого домена.
Заключение
Вы узнали о двух общих подходах для структурирования ваших проектов Terraform в зависимости от их сложности. Согласно простым схемам структурирования, используя provisioner remote-exec
для выполнения команд, вы затем развернули Droplet с работой Apache с записями DNS для вашего домена.
Комментарием к вашему руководству является следующая структура файлов проекта, который вы создали в этом уроке:
.
└── tf/
├── versions.tf
├── variables.tf
├── provider.tf
├── droplets.tf
├── dns.tf
├── data-sources.tf
└── external/
└── name-generator.py
Ресурсы, которые вы определили (Droplet, DNS-запись и динамический источник данных, провайдер DigitalOcean и переменные), хранятся в отдельных файлах, согласно простой структуре проекта, описанной в первой секции этого учебника.
Для получения дополнительной информации о Terraform-провайдерах и их параметрах обратитесь к официальной документации.
Этот урок является частью серии учебников Как управлять инфраструктурой с помощью Terraform. Серия охватывает ряд тем Terraform, от установки Terraform впервые до управления сложными проектами.
Source:
https://www.digitalocean.com/community/tutorials/how-to-structure-a-terraform-project