Как использовать Terraform с DigitalOcean

Введение

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

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

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

Примечание: Это руководство было протестировано с Terraform 1.1.3.

Предварительные условия

Для завершения этого руководства вам понадобятся:

Шаг 1 — Установка Terraform

Terraform – это инструмент командной строки, который вы запускаете на своем рабочем столе или на удаленном сервере. Чтобы установить его, вам нужно загрузить и разместить его в своем каталоге PATH, чтобы можно было выполнять его в любом рабочем каталоге.

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

На macOS используйте эту команду для загрузки Terraform и размещения его в вашем домашнем каталоге:

  1. curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_darwin_amd64.zip

На Linux используйте эту команду:

  1. curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_linux_amd64.zip

Создайте каталог ~/opt/terraform:

  1. mkdir -p ~/opt/terraform

Затем разархивируйте Terraform в ~/opt/terraform, используя команду unzip. На Ubuntu вы можете установить unzip с помощью apt:

  1. sudo apt install unzip

Используйте его для извлечения загруженного архива в каталог ~/opt/terraform, запустив:

  1. unzip ~/terraform.zip -d ~/opt/terraform

Наконец, добавьте ~/opt/terraform в вашу переменную среды PATH, чтобы вы могли выполнять команду terraform без указания полного пути к исполняемому файлу.

На Linux вам потребуется переопределить переменную PATH в файле .bashrc, который запускается при открытии нового оболочечного сеанса. Откройте его для редактирования, запустив:

  1. nano ~/.bashrc

Примечание: На macOS добавьте путь к файлу .bash_profile, если используете Bash, или к .zshrc, если используете ZSH.

Чтобы добавить путь Terraform в вашу переменную PATH, добавьте следующую строку в конец файла:

.bashrc
export PATH=$PATH:~/opt/terraform

Сохраните и закройте файл, когда закончите.

Теперь все новые оболочечные сеансы смогут найти команду terraform. Чтобы загрузить новое значение переменной PATH в текущий сеанс, выполните следующую команду, если используете Bash на Linux:

  1. . ~/.bashrc

Если вы используете Bash на macOS, выполните вместо этого эту команду:

  1. . .bash_profile

Если вы используете ZSH, выполните эту команду:

  1. . .zshrc

Чтобы убедиться, что Terraform установлен правильно, выполните команду terraform без аргументов:

  1. terraform

Вы увидите вывод, похожий на следующий:

Output
Usage: terraform [global options] <subcommand> [args] The available commands for execution are listed below. The primary workflow commands are given first, followed by less common or more advanced commands. Main commands: init Prepare your working directory for other commands validate Check whether the configuration is valid plan Show changes required by the current configuration apply Create or update infrastructure destroy Destroy previously-created infrastructure All other commands: console Try Terraform expressions at an interactive command prompt fmt Reformat your configuration in the standard style force-unlock Release a stuck lock on the current workspace get Install or upgrade remote Terraform modules graph Generate a Graphviz graph of the steps in an operation import Associate existing infrastructure with a Terraform resource login Obtain and save credentials for a remote host logout Remove locally-stored credentials for a remote host output Show output values from your root module providers Show the providers required for this configuration refresh Update the state to match remote systems show Show the current state or a saved plan state Advanced state management taint Mark a resource instance as not fully functional test Experimental support for module integration testing untaint Remove the 'tainted' state from a resource instance version Show the current Terraform version workspace Workspace management Global options (use these before the subcommand, if any): -chdir=DIR Switch to a different working directory before executing the given subcommand. -help Show this help output, or the help for a specified subcommand. -version An alias for the "version" subcommand.

Это команды, которые принимает Terraform. В выводе вы найдете краткое описание, а более подробно о них вы узнаете в этом учебнике.

Теперь, когда Terraform установлен, давайте настроим его для работы с ресурсами DigitalOcean.

Шаг 2 — Настройка Terraform для DigitalOcean

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

Провайдер DigitalOcean позволяет Terraform взаимодействовать с API DigitalOcean для создания инфраструктуры. Этот провайдер поддерживает создание различных ресурсов DigitalOcean, включая следующие:

  • digitalocean_droplet: Droplets (серверы)
  • digitalocean_loadbalancer: Балансировщики нагрузки
  • digitalocean_domain: Записи доменов DNS
  • digitalocean_record: Записи DNS

Terraform будет использовать ваш персональный токен доступа к DigitalOcean для общения с API DigitalOcean и управления ресурсами в вашей учетной записи. Не передавайте этот ключ другим и храните его вне скриптов и системы контроля версий. Экспортируйте ваш персональный токен доступа к DigitalOcean в переменную среды с именем DO_PAT, выполнив следующую команду:

  1. export DO_PAT="your_personal_access_token"

Это упростит его использование в последующих командах и сохранит его отдельно от вашего кода.

Примечание: Если вы часто будете работать с Terraform и DigitalOcean, добавьте эту строку в ваши файлы конфигурации оболочки, используя тот же подход, который вы использовали для изменения вашей переменной среды PATH на предыдущем шаге.

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

  1. mkdir ~/loadbalance

Перейдите в новый созданный каталог:

  1. cd ~/loadbalance

Конфигурации Terraform – это текстовые файлы с расширением файла .tf. Они читаемы для человека и поддерживают комментарии. (Terraform также поддерживает файлы конфигурации в формате JSON, но они не будут рассматриваться здесь.) Terraform будет читать все файлы конфигурации в вашем рабочем каталоге декларативно, поэтому порядок определений ресурсов и переменных не имеет значения. Вся ваша инфраструктура может существовать в одном файле конфигурации, но вы должны разделять файлы конфигурации по типу ресурсов для обеспечения ясности.

Первый шаг к построению инфраструктуры с помощью Terraform – определить провайдера, который вы собираетесь использовать.

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

  1. nano provider.tf

Добавьте следующие строки в файл, чтобы сообщить Terraform, что вы хотите использовать провайдера DigitalOcean, и указать Terraform, где его найти:

~/loadbalance/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

Затем определите следующие переменные в файле, чтобы вы могли ссылаться на них в остальных файлах вашей конфигурации:

  • do_token: ваш персональный токен доступа к DigitalOcean.
  • pvt_key: расположение закрытого ключа, чтобы Terraform мог использовать его для входа на новые узлы и установки Nginx.

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

Чтобы определить эти переменные, добавьте эти строки в файл:

~/loadbalance/provider.tf
...
variable "do_token" {}
variable "pvt_key" {}

Затем добавьте эти строки для настройки провайдера DigitalOcean и укажите учетные данные для вашей учетной записи DigitalOcean, присвоив do_token аргументу token провайдера:

~/loadbalance/provider.tf
...
provider "digitalocean" {
  token = var.do_token
}

Наконец, вы захотите, чтобы Terraform автоматически добавил ваш ключ SSH на любые новые узлы, которые вы создаете. Когда вы добавили свой ключ SSH в DigitalOcean, вы дали ему имя. Terraform может использовать это имя для получения открытого ключа. Добавьте эти строки, заменив terraform именем ключа, которое вы указали в своей учетной записи DigitalOcean:

~/loadbalance/provider.tf
...
data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

Ваш завершенный файл provider.tf будет выглядеть так:

~/loadbalance/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

variable "do_token" {}
variable "pvt_key" {}

provider "digitalocean" {
  token = var.do_token
}

data "digitalocean_ssh_key" "terraform" {
  name = "terraform"
}

Когда закончите, сохраните и закройте файл.

Примечание: Установка переменной среды TF_LOG равной 1 включит подробное ведение журнала того, что пытается сделать Terraform. Вы можете установить его, выполнив:

  1. export TF_LOG=1

Инициализируйте Terraform для вашего проекта, выполнив:

  1. terraform init

Это прочтет вашу конфигурацию и установит плагины для вашего провайдера. Вы увидите это залогировано в выводе:

Output
Initializing the backend... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) 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.

Если у вас возникли проблемы, и Terraform не работает так, как вы ожидаете, вы можете начать заново, удалив файл terraform.tfstate и вручную уничтожив созданные ресурсы (например, через панель управления).

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

Шаг 3 — Определение первого сервера Nginx

Вы можете использовать Terraform для создания Droplet DigitalOcean и установки программного обеспечения на Droplet после его запуска. На этом этапе вы будете предоставлять один Droplet Ubuntu 20.04 и устанавливать веб-сервер Nginx с использованием Terraform.

Создайте новый файл конфигурации Terraform с именем www-1.tf, который будет содержать конфигурацию Droplet:

  1. nano www-1.tf

Вставьте следующие строки, чтобы определить ресурс Droplet:

~/loadbalance/www-1.tf
resource "digitalocean_droplet" "www-1" {
    image = "ubuntu-20-04-x64"
    name = "www-1"
    region = "nyc3"
    size = "s-1vcpu-1gb"
    ssh_keys = [
      data.digitalocean_ssh_key.terraform.id
    ]

В предшествующей конфигурации первая строка определяет ресурс digitalocean_droplet с именем www-1. Остальные строки указывают атрибуты Droplet, включая центр данных, в котором он будет находиться, и слаг, который идентифицирует размер Droplet, который вы хотите настроить. В этом случае вы используете s-1vcpu-1gb, который создаст Droplet с одним CPU и 1 ГБ оперативной памяти. (Посетите эту таблицу слагов размеров, чтобы увидеть доступные слаги, которые вы можете использовать.)

Раздел ssh_keys определяет список открытых ключей, которые вы хотите добавить к Droplet. В этом случае вы указываете ключ, который определен в provider.tf. Убедитесь, что имя здесь совпадает с именем, указанным в provider.tf.

Когда вы запускаете Terraform против API DigitalOcean, он собирает различную информацию о Droplet, такую как его общедоступный и частный IP-адреса. Эту информацию можно использовать другими ресурсами в вашей конфигурации.

Если вы задаетесь вопросом, какие аргументы обязательны или необязательны для ресурса Droplet, пожалуйста, обратитесь к официальной документации Terraform: Спецификация Droplet в DigitalOcean.

Чтобы настроить connection, которое Terraform может использовать для подключения к серверу по SSH, добавьте следующие строки в конце файла:

~/loadbalance/www-1.tf
...
connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.pvt_key)
    timeout = "2m"
  }

Эти строки описывают, как Terraform должен подключаться к серверу, так что Terraform может подключиться через SSH для установки Nginx. Обратите внимание на использование переменной закрытого ключа var.pvt_key – вы передадите ее значение при запуске Terraform.

Теперь, когда у вас настроено подключение, настройте предоставитель remote-exec, который вы будете использовать для установки Nginx. Добавьте следующие строки в конфигурацию, чтобы сделать это:

~/loadbalance/www-1.tf
...
provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # установка nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

Обратите внимание, что строки в массиве inline – это команды, которые пользователь root будет выполнять для установки Nginx.

Завершенный файл выглядит так:

~/loadbalance/www-1.tf
resource "digitalocean_droplet" "www-1" {
  image = "ubuntu-20-04-x64"
  name = "www-1"
  region = "nyc3"
  size = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.terraform.id
  ]
  
  connection {
    host = self.ipv4_address
    user = "root"
    type = "ssh"
    private_key = file(var.pvt_key)
    timeout = "2m"
  }
  
  provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # установка nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

Сохраните файл и выйдите из редактора. Вы определили сервер и готовы развернуть его, что вы сейчас и сделаете.

Шаг 4 — Использование Terraform для создания сервера Nginx

Ваша текущая конфигурация Terraform описывает один сервер Nginx. Теперь вы развернете Droplet точно так, как он определен.

Запустите команду terraform plan, чтобы увидеть план выполнения или то, что Terraform попытается сделать, чтобы построить инфраструктуру, которую вы описали. Вам придется указать значения для вашего токена доступа DigitalOcean и пути к вашему закрытому ключу, так как ваша конфигурация использует эту информацию для доступа к вашему Droplet для установки Nginx. Запустите следующую команду, чтобы создать план:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Предупреждение: Команда terraform plan поддерживает параметр -out для сохранения плана. Однако план будет хранить ключи API, и Terraform не шифрует эти данные. При использовании этой опции вы должны рассмотреть возможность шифрования этого файла, если планируете отправить его другим или оставить его в покое на длительное время.

Вы увидите вывод, аналогичный следующему:

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: # digitalocean_droplet.www-1 будет создан + resource "digitalocean_droplet" "www-1" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + 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 = "www-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "nyc3" + 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) } Plan: 1 to add, 0 to change, 0 to destroy. ─────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Строка + resource "digitalocean_droplet" "www-1" означает, что Terraform создаст новый ресурс Droplet с именем www-1 и указанными деталями. Это и должно произойти, поэтому выполните команду terraform apply, чтобы выполнить текущий план:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Вы получите тот же вывод, что и раньше, но на этот раз Terraform спросит вас, хотите ли вы продолжить:

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

Введите yes и нажмите ENTER. Terraform настроит ваш Droplet:

Output
digitalocean_droplet.www-1: Creating...

Через некоторое время вы увидите, как Terraform устанавливает Nginx с помощью провиженера remote-exec, и затем процесс завершится:

Output
digitalocean_droplet.www-1: Provisioning with 'remote-exec'... .... digitalocean_droplet.www-1: Creation complete after 1m54s [id=your_www-1_droplet_id] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ...

Terraform создал новый Droplet с именем www-1 и установил на него Nginx. Если вы перейдете по публичному IP-адресу вашего нового Droplet, вы увидите приветственный экран Nginx. Публичный IP-адрес был отображен при создании Droplet, но вы всегда можете посмотреть его, просматривая текущее состояние Terraform. Terraform обновляет файл состояния terraform.tfstate каждый раз, когда выполняет план или обновляет свое состояние.

Чтобы просмотреть текущее состояние вашей среды, используйте следующую команду:

  1. terraform show terraform.tfstate

Это покажет вам публичный IP-адрес вашего Droplet.

Output
resource "digitalocean_droplet" "www-1" { backups = false created_at = "..." disk = 25 id = "your_www-1_droplet_id" image = "ubuntu-20-04-x64" ipv4_address = "your_www-1_server_ip" ipv4_address_private = "10.128.0.2" ...

Перейдите по адресу http://your_www-1_server_ip в вашем браузере, чтобы убедиться, что ваш сервер Nginx работает.

Примечание: Если вы изменяете свою инфраструктуру вне Terraform, ваш файл состояния будет устаревшим. Если ваши ресурсы изменены вне Terraform, вам потребуется обновить файл состояния, чтобы привести его в актуальное состояние. Эта команда извлечет обновленную информацию о ресурсах у ваших провайдеров:

  1. terraform refresh \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

На этом этапе вы развернули Droplet, который описали в Terraform. Теперь вы создадите второй.

Шаг 5 — Создание второго сервера Nginx

Теперь, когда вы описали сервер Nginx, вы можете быстро добавить второй, скопировав существующий файл конфигурации сервера и заменив имя и имя хоста ресурса Droplet.

Вы можете сделать это вручную, но быстрее использовать команду sed для чтения файла www-1.tf, замены всех вхождений www-1 на www-2 и создания нового файла с именем www-2.tf. Вот команда sed для этого:

  1. sed 's/www-1/www-2/g' www-1.tf > www-2.tf

Вы можете узнать больше о sed, посетив Использование sed.

Запустите terraform plan еще раз, чтобы просмотреть изменения, которые сделает Terraform:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Вывод показывает, что Terraform создаст второй сервер, www-2:

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: # digitalocean_droplet.www-2 будет создан + resource "digitalocean_droplet" "www-2" { + 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 = "www-2" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = true + region = "nyc3" + 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) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Запустите terraform apply снова, чтобы создать второй экземпляр Droplet:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Как и ранее, Terraform попросит вас подтвердить свое желание продолжить. Пересмотрите план еще раз и введите yes, чтобы продолжить.

Через некоторое время Terraform создаст новый сервер и отобразит результаты:

Output
digitalocean_droplet.www-2: Creation complete after 1m47s [id=your_www-2_droplet_id] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Terraform создал новый сервер, не изменяя существующий. Вы можете повторить этот шаг, чтобы добавить дополнительные серверы Nginx.

Теперь, когда у вас есть два работающих Droplet’а с Nginx, вы определите и развернете балансировщик нагрузки, чтобы распределить трафик между ними.

Шаг 6 — Создание балансировщика нагрузки

Вы будете использовать Балансировщик нагрузки DigitalOcean, который поддерживается официальным провайдером Terraform, чтобы маршрутизировать трафик между двумя веб-серверами.

Создайте новый файл конфигурации Terraform с именем loadbalancer.tf:

  1. nano loadbalancer.tf

Добавьте следующие строки, чтобы определить Балансировщик нагрузки:

~/loadbalance/loadbalancer.tf
resource "digitalocean_loadbalancer" "www-lb" {
  name = "www-lb"
  region = "nyc3"

  forwarding_rule {
    entry_port = 80
    entry_protocol = "http"

    target_port = 80
    target_protocol = "http"
  }

  healthcheck {
    port = 22
    protocol = "tcp"
  }

  droplet_ids = [digitalocean_droplet.www-1.id, digitalocean_droplet.www-2.id ]
}

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

Запустите команду terraform plan снова, чтобы просмотреть новый план выполнения:

  1. terraform plan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Вы увидите несколько строк вывода, включая следующие строки:

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: # digitalocean_loadbalancer.www-lb будет создан + resource "digitalocean_loadbalancer" "www-lb" { + algorithm = "round_robin" + disable_lets_encrypt_dns_records = false + droplet_ids = [ + ..., + ..., ] + enable_backend_keepalive = false + enable_proxy_protocol = false + id = (known after apply) + ip = (known after apply) + name = "www-lb" + redirect_http_to_https = false + region = "nyc3" + size_unit = (known after apply) + status = (known after apply) + urn = (known after apply) + vpc_uuid = (known after apply) + forwarding_rule { + certificate_id = (known after apply) + certificate_name = (known after apply) + entry_port = 80 + entry_protocol = "http" + target_port = 80 + target_protocol = "http" + tls_passthrough = false } + healthcheck { + check_interval_seconds = 10 + healthy_threshold = 5 + port = 22 + protocol = "tcp" + response_timeout_seconds = 5 + unhealthy_threshold = 3 } + sticky_sessions { + cookie_name = (known after apply) + cookie_ttl_seconds = (known after apply) + type = (known after apply) } } Plan: 1 to add, 0 to change, 0 to destroy. ...

Это означает, что Droplets www-1 и www-2 уже существуют, и Terraform создаст Load Balancer www-lb.

Запустите terraform apply, чтобы создать Load Balancer:

  1. terraform apply \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Еще раз Terraform попросит вас проверить план. Утвердите план, введя yes, чтобы продолжить.

Как только вы это сделаете, вы увидите вывод, который содержит следующие строки, усеченные для краткости:

Output
... digitalocean_loadbalancer.www-lb: Creating... ... digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id] ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ...

Используйте terraform show terraform.tfstate, чтобы найти IP-адрес вашего балансировщика нагрузки:

  1. terraform show terraform.tfstate

Вы найдете IP-адрес под записью www-lb:

Output
... # digitalocean_loadbalancer.www-lb: resource "digitalocean_loadbalancer" "www-lb" { algorithm = "round_robin" disable_lets_encrypt_dns_records = false droplet_ids = [ your_www-1_droplet_id, your_www-2_droplet_id, ] enable_backend_keepalive = false enable_proxy_protocol = false id = "your_load_balancer_id" ip = "your_load_balancer_ip" name = "www-lb" ...

Перейдите по адресу http://ваш_адрес_балансировщика_нагрузки в вашем браузере, и вы увидите приветственный экран Nginx, потому что балансировщик нагрузки направляет трафик на один из двух серверов Nginx.

Теперь вы узнаете, как настроить DNS для вашей учетной записи DigitalOcean с использованием Terraform.

Шаг 7 — Создание DNS-доменов и записей

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

Примечание: Используйте собственное уникальное доменное имя, иначе Terraform не сможет развернуть ресурсы DNS. Убедитесь, что ваш домен указан на имена серверов DigitalOcean.

Создайте новый файл для описания вашего DNS:

  1. nano domain_root.tf

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

~/loadbalance/domain_root.tf
resource "digitalocean_domain" "default" {
   name = "your_domain"
   ip_address = digitalocean_loadbalancer.www-lb.ip
}

Сохраните и закройте файл, когда закончите.

Вы также можете добавить запись CNAME, которая указывает www.your_domain на your_domain. Создайте новый файл для записи CNAME:

  1. nano domain_cname.tf

Добавьте эти строки в файл:

domain_cname.tf
resource "digitalocean_record" "CNAME-www" {
  domain = digitalocean_domain.default.name
  type = "CNAME"
  name = "www"
  value = "@"
}

Сохраните и закройте файл, когда закончите.

Чтобы добавить DNS-записи, выполните terraform plan, а затем terraform apply, как и для других ресурсов.

Перейдите на ваше доменное имя, и вы увидите приветственный экран Nginx, потому что домен указывает на балансировщик нагрузки, который отправляет трафик на один из двух серверов Nginx.

Шаг 8 — Уничтожение вашей инфраструктуры

Хотя Terraform не является широко используемым в производственных средах, он также может уничтожать инфраструктуру, которую создал. Это в основном полезно в средах разработки, которые разворачиваются и уничтожаются несколько раз.

Сначала создайте план выполнения для уничтожения инфраструктуры, используя terraform plan -destroy:

  1. terraform plan -destroy -out=terraform.tfplan \
  2. -var "do_token=${DO_PAT}" \
  3. -var "pvt_key=$HOME/.ssh/id_rsa"

Terraform выведет план с ресурсами, отмеченными красным цветом и предваренными знаком минус, что указывает на удаление ресурсов в вашей инфраструктуре.

Затем используйте terraform apply для выполнения плана:

  1. terraform apply terraform.tfplan

Terraform приступит к уничтожению ресурсов, как указано в сгенерированном плане.

Заключение

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

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

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

Этот учебник является частью серии Как управлять инфраструктурой с помощью Terraform. В серии рассматривается ряд тем по Terraform, от установки Terraform впервые до управления сложными проектами.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean