Поиск по сайту:

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


Введение

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

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

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

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

Предпосылки

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

  • Учетная запись DigitalOcean. Если у вас его нет, зарегистрируйте новый аккаунт.
  • Токен личного доступа DigitalOcean, который можно создать с помощью панели управления DigitalOcean. Инструкции по этому поводу можно найти в разделе Как создать токен личного доступа.
  • К вашей учетной записи DigitalOcean добавлен SSH-ключ без пароля, который вы можете создать, следуя инструкции «Как использовать SSH-ключи с дроплетами DigitalOcean». Когда вы добавляете ключ в свою учетную запись, запомните имя, которое вы ему дали, так как оно понадобится вам в этом руководстве. (Чтобы Terraform принял имя вашего ключа, оно должно начинаться с буквы или символа подчеркивания и может содержать только буквы, цифры, символы подчеркивания и дефисы.)
  • Личный домен указывал на сервер имен DigitalOcean, что можно сделать, следуя руководству «Как указать на серверы имен DigitalOcean от общих регистраторов доменов».

Шаг 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, добавьте следующую строку в конец файла:

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: дроплеты (серверы)
  • digitalocean_loadbalancer: балансировщики нагрузки
  • digitalocean_domain: записи домена DNS
  • digitalocean_record: записи DNS

Terraform будет использовать ваш токен личного доступа DigitalOcean для связи с DigitalOcean API и управления ресурсами в вашей учетной записи. Не делитесь этим ключом с другими и держите его подальше от скриптов и контроля версий. Экспортируйте свой токен личного доступа 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, где его найти:

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

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

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

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

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

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

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

...
provider "digitalocean" {
  token = var.do_token
}

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

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

Ваш заполненный файл 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 для определения капли, которая будет запускать сервер Nginx.

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

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

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

  1. nano www-1.tf

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

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. В остальных строках указываются атрибуты дроплета, в том числе центр обработки данных, в котором он будет находиться, и слаг, определяющий размер дроплета, который вы хотите настроить. В этом случае вы используете s-1vcpu-1gb, который создаст дроплет с одним процессором и 1 ГБ ОЗУ. (Посетите эту таблицу размеров слагов, чтобы увидеть доступные слаги, которые вы можете использовать.)

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

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

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

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

...
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. Добавьте следующие строки в конфигурацию, чтобы сделать именно это:

...
provisioner "remote-exec" {
    inline = [
      "export PATH=$PATH:/usr/bin",
      # install nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

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

Готовый файл выглядит так:

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",
      # install nginx
      "sudo apt update",
      "sudo apt install -y nginx"
    ]
  }
}

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

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

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

Запустите команду terraform plan, чтобы увидеть план выполнения или то, что Terraform попытается сделать для создания описанной вами инфраструктуры. Вам нужно будет указать значения для вашего токена доступа DigitalOcean и путь к вашему закрытому ключу, так как ваша конфигурация использует эту информацию для доступа к вашему дроплету для установки 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 will be created + 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 предоставит вашу каплю:

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 создал новую каплю с именем www-1 и установил на нее Nginx. Если вы посетите общедоступный IP-адрес вашего нового дроплета, вы увидите экран приветствия Nginx. Общедоступный IP-адрес отображался при создании дроплета, но вы всегда можете просмотреть его, просмотрев текущее состояние Terraform. Terraform обновляет файл состояния terraform.tfstate каждый раз, когда выполняет план или обновляет свое состояние.

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

  1. terraform show terraform.tfstate

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

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"

На этом этапе вы развернули дроплет, который описали в 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 will be created + 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 еще раз, чтобы создать вторую каплю:

  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.

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

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

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

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

  1. nano 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 ]
}

В определении балансировщика нагрузки указывается его имя, центр обработки данных, в котором он будет находиться, порты, которые он должен прослушивать для балансировки трафика, конфигурация для проверки работоспособности и идентификаторы капель, которые он должен балансировать, которые вы получаете с помощью переменных 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 will be created + 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. ...

Это означает, что дроплеты www-1 и www-2 уже существуют, и Terraform создаст балансировщик нагрузки www-lb.

Запустите terraform apply, чтобы создать балансировщик нагрузки:

  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://your_load_balancer_ip в своем браузере, и вы увидите экран приветствия Nginx, поскольку балансировщик нагрузки отправляет трафик на один из двух серверов Nginx.

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

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

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

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

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

  1. nano domain_root.tf

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

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

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

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 до управления сложными проектами.