Как структурировать проект Terraform

Интродукция

Структурирование проектов при помощи Terraform в соответствии с их использованием и представленной сложностью является важностью для обеспечения их поддерживаемости и расширяемости во время работы. Необходимо принимать системную методику организации файлов кода, чтобы проект остался масштабируемым при развертывании и был доступным для вас и вашей команды.

В этой статье вы узнают о структурировании проектов при помощи Terraform в соответствии с их общей направленностью и сложностью. Затем вы создадите проект с простой структурой используя более часто использующие функции Terraform: переменные, локалы, источники данных и предоставлятели. В конце ваш проект будет развертывать сервер Ubuntu 20.04 на DigitalOcean, установить веб-сервер Apache, а также привязать ваш домен к веб-серверу.

Преrequisitos

Примечание: Это руководство особенно испытано с 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 следующим законом:

  1. mkdir ~/apache-droplet-terraform

Перейдите в него:

  1. cd ~/apache-droplet-terraform

Так как этот проект будет использовать простую структуру, вы будете хранить код провайдера, переменные, Droplet и запись DNS в отдельных файлах, согласно структуре файлов из предыдущего раздела. Сначала вам нужно добавить провайдера DigitalOcean Terraform в ваш проект как обязательного провайдера.

Создайте файл с именем versions.tf и откройте его для редактирования, выполнив следующий запрос:

  1. nano versions.tf

Добавьте следующие строки:

~/apache-droplet-terraform/versions.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

В этом блоке 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:

  1. nano variables.tf

Добавьте следующие переменные:

~/apache-droplet-terraform/variables.tf
variable "do_token" {}
variable "domain_name" {}

Сохраните и закройте файл.

Переменная do_token будет содержать ваш токен доступа персонального аккаунта DigitalOcean, а domain_name будет указывать на ваш желаемый домен. Запущенный Droplett будет автоматически установлен SSH-ключ, идентифицированный по отпечатку SSH.

Далее мы определим экземпляр провайдера DigitalOcean для этого проекта. Вы сохраните его в файле с именем provider.tf. Создайте и откройте его для редактирования, запустив:

  1. nano provider.tf

Добавьте провайдера:

~/apache-droplet-terraform/provider.tf
provider "digitalocean" {
  token = var.do_token
}

Сохраните и выйдите, когда вы закончите. Вы определили провайдера digitalocean, который соответствует необходимому вам провайдеру, указанному ранее в provider.tf, и установили его токен значением переменной, которое будет предоставлено во времяRuntime.

В этом шаге вы создали directory для вашего проекта, запросили, чтобы провайдер DigitalOcean был доступен, объявили переменные проекта и настроили соединение с экземпляром провайдера DigitalOcean, используя токен аутентификации, который будет предоставлен позже. Теперь вы начнете писать скрипт, который будет генерировать динамические данные для определений вашего проекта.

Шаг 2 — Создание Python-скрипта для динамических данных

Перед тем, как перейти к определению Droplet, вы создадите Python скрипт, который будет генерировать имя Droplet динамически и объявить ресурс источника данных для его анализа. Имя будет генерироваться путем конкатенации непременного строки (web) с текущим временем локального компьютера, выраженным в формате UNIX эпохи. Скрипт для названия может быть полезен, когда создается несколько Droplet в соответствии с названием, для удобного их различения.

Вы сохраните скрипт в файле с именем name-generator.py в каталоге с именем external. Сначала создайте каталог, запустив:

  1. mkdir external

Каталог external находится в корне вашего проекта и будет хранить файлы, не содержащие HCL кода, например, Python скрипт, который вы напишете.

Создайте name-generator.py в external и откройте его для редактирования:

  1. nano external/name-generator.py

Добавьте следующий код:

external/name-generator.py
import json, time

fixed_name = "web"
result = {
  "name": f"{fixed_name}-{int(time.time())}",
}

print(json.dumps(result))

Этот Python скрипт импортирует модули json и time, объявляет словарь с именем result и устанавливает значение ключа name в переменную, которая объединяет fixed_name с текущим UNIX временем машины, на которой он запущен. Затем result преобразуется в JSON и выводится на stdout. Вывод будет различным каждый раз, когда скрипт запускается:

Output
{"name": "web-1597747959"}

Когда вы завершите работу, сохраните и закрыть файл.

Примечание: Большие и сложные структурные проекты требуют более подробного рассмотрения как создаются и используются источники данных, особенно в отношении переносимости и обработки ошибок. Терраформexpects выполняемый программы писать человечески readable ошибочную информацию на stderr и принимать конечность с неотрицательным статусом, что ниже показанно в этой шаге из-за простоты задачи. Кроме того, он expecte программу иметь ни одной сторонней воздействия, так что можно использовать его любые числа раз.

Для получения более подробной информы о том, чтоTerraformexpects от источников данных, посетите официальные документы.

Теперь, когда сript готов, вы можете definir источник данных, который будет получать данные из сript. Вы должны создать файл data-sources.tf в корне вашего проекта согласно простейшему подходу к организации.

Создайте его для редактирования командой:

  1. nano data-sources.tf

Добавить следующий дефиниция:

~/apache-droplet-terraform/data-sources.tf
data "external" "droplet_name" {
  program = ["python3", "${path.module}/external/name-generator.py"]
}

Сохраните и закрыть файл.

Этот источник данных называется droplet_name и использует Python 3, который расположен в директории external, которой вы just создали. Он автоматически парсит свой вывод и предоставляет deserializec data под свойство result для использования во всех других дефинициях ресурсов.

Соответственно теперь вы можете definir Droplet, на котором будет работать Apache.

Шаг 3 — Определение размера

В этой стадии вы будете писать определение размера и сохранять его в файл кода, который относится к размеру, как положено при использовании простого подхода. Имя будет получено из источника данных, который был создан ранее, и будет различаться при каждом развертывании. Создайте и откройте файл droplets.tf для редактирования:

Создайте и откройте файл droplets.tf для редактирования:

  1. nano droplets.tf

Добавить следующий размер ресурса размера:

~/apache-droplet-terraform/droplets.tf
data "digitalocean_ssh_key" "ssh_key" {
  name = "your_ssh_key_name"
}

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = data.external.droplet_name.result.name
  region = "fra1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.ssh_key.id
  ]
}

Вы первым объявляете ресурс 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, поскольку это отдельный тип ресурсов от других, которые вы создали в предыдущих шагах. Создайте и откройте его для редактирования:

  1. nano dns.tf

Добавить следующие строки:

~/apache-droplet-terraform/dns.tf
resource "digitalocean_record" "www" {
  domain = var.domain_name
  type   = "A"
  name   = "@"
  value  = digitalocean_droplet.web.ipv4_address
}

Этот код объявляет DigitalOcean DNS-реcord на ваш домен (используется переменная), типа A. Рекорд имеет имя @, которое является местоположением самого домена и значением его valuel. Вы можете заменить значение name на что-либо другое, что приведет к созданию поддомена.

Когда вы завершили, сохраните и закрыть файл.

Теперь, после того как вы конфигурировали Dropleт, источник данных для генерации случайных чисел, и DNS-реcord, вы перейдете к развертыванию проекта в облаке.

Шаг 5 — Планирование и Применение конфигурации

На этой странице вы будете инициализировать ваш проект Terraform, развертывать его в облаке и проверить, что все было примененноcorrectly.

Сегодняшним шагом вы должны начать работу с вашим проектом Terraform, развернуть его в облаке и проверить, что все было примененноcorrectly.

  1. terraform init

Для начала вы должны выполнить следующий команду:

Output
Initializing 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.

  1. export DO_PAT="your_do_api_token"
  2. export DO_DOMAIN_NAME="your_domain"

Начать сdefine имени домена, фingerprint SSH ключа и ваш личный токен доступа, чтобы не приходилось копировать значения каждый раз, когда вы используете Terraform. Выполните следующие команды, заменив подlined values:

Вы можете найти свой API-токен в панели управления DigitalOcean.

  1. terraform plan -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}"

Используйте следующие команды, передавая значения переменных окружения:

Output
Terraform 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

  1. terraform apply -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}"

# digitalocean_record.www will be created

Output
Plan: 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:

Output
digitalocean_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-адрес:

  1. terraform show | grep "ipv4"

Вы получите IP-адрес вашего Droplet:

Output
ipv4_address = "your_Droplet_IP" ...

Вы можете проверить общедоступные A-записи, запустив:

  1. nslookup -type=a your_domain | grep "Address" | tail -1

Выход будет показывать IP-адрес, к которому указывает A-запись:

Output
Address: your_Droplet_IP

Они совпадают, как и должны, что意味着 Droplet и DNS-запись были успешно настроены.

Для того, чтобы изменения в следующем шаге были выполнены, удалите развернутые ресурсы, запустив:

  1. terraform destroy -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}"

Когда вам будет предложено, введите 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 для редактирования:

  1. nano variables.tf

Добавьте выделенную строку:

~/apache-droplet-terraform/variables.tf
variable "do_token" {}
variable "domain_name" {}
variable "private_key" {}

Вы теперь добавили новую переменную, называемую private_key , к вашему проекту. Сохраните и закрыть файл.

Следующий шаг состоит в добавлении данных для подключения и объявления провизоNERов для Droplet в конфигурации. Открой droplets.tf для редактирования командой:

  1. nano droplets.tf

Расширьте существующий код с выделенными линиями:

~/apache-droplet-terraform/droplets.tf
data "digitalocean_ssh_key" "ssh_key" {
  name = "your_ssh_key_name"
}

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = data.external.droplet_name.result.name
  region = "fra1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.ssh_key.id
  ]

  connection {
    host        = self.ipv4_address
    user        = "root"
    type        = "ssh"
    private_key = file(var.private_key)
    timeout     = "2m"
  }

  provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # Установить Apache
      "apt update",
      "apt -y install apache2"
    ]
  }
}

Блок connection указывает как Terraform должен обращаться к целевому Droplet. Блок provisioner содержит массив команд, которые будут выполнены после провизоNERа, то есть обновление缓存 пакетов и установка Apache. Сохраните и выйдите, когда вы закончите.

Также можно создать временную переменную окружения для пути к частному ключу:

  1. export DO_PRIVATE_KEY="private_key_location"

Примечание: Private key, а также любой другой файл, который вы хотите загрузить внутри Terraform, должны быть размещены внутри проекта. Для получения более подробной информации о установке SSH-ключа на сервере Linux обратитесь к руководству How To Configure SSH Key-Based Authentication on a Linux Server о процедуре установки SSH-ключа на Ubuntu 20.04 или других дистрибутивах.

Попробуйте применить конфигурацию снова:

  1. terraform apply -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}" -var "private_key=${DO_PRIVATE_KEY}"

Введите yes, когда появится запрос. Вы получите выходной файл, схожий с предыдущим, но следующий за ним будет длинный вывод провайдера remote-exec:

Output
digitalocean_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, когда появится запрос:

  1. terraform destroy -var "do_token=${DO_PAT}" -var "domain_name=${DO_DOMAIN_NAME}" -var "private_key=${DO_PRIVATE_KEY}"

Теперь вы завершили небольшой проект 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