Введение
Terraform — это инструмент для создания и управления инфраструктурой в организованном порядке. Вы можете использовать его для управления дроплетами DigitalOcean, балансировщиками нагрузки и даже записями DNS, а также для широкого спектра услуг, предлагаемых другими поставщиками. Terraform использует интерфейс командной строки и может запускаться как с вашего компьютера, так и с удаленного сервера.
Terraform считывает файлы конфигурации, описывающие компоненты, составляющие вашу прикладную среду или центр обработки данных. На основе конфигурации он создаёт исполняемый план, описывающий действия для достижения желаемого состояния. Затем Terraform реализует этот план для построения вашей инфраструктуры. При изменении конфигурации Terraform может создавать и выполнять инкрементальные планы для обновления существующей инфраструктуры до нового описанного состояния.
В этом руководстве вы установите Terraform и создадите с его помощью инфраструктуру на DigitalOcean, состоящую из двух серверов Nginx, балансируемых балансировщиком нагрузки DigitalOcean. Далее вы добавите с помощью Terraform запись DNS на DigitalOcean, указывающую на балансировщик нагрузки. Это поможет вам начать работу с Terraform и даст представление о том, как использовать Terraform для управления и развертывания инфраструктуры на базе DigitalOcean, отвечающей вашим потребностям.
Предпосылки
- Аккаунт DigitalOcean
- Персональный код доступа DigitalOcean, который вы можете создать через панель управления DigitalOcean.
- К вашей учетной записи DigitalOcean был добавлен беспарольный SSH-ключ.
- Персональный домен, указывающий на сервер под названием DigitalOcean.
Шаг 1 — Установка Terraform
Terraform — это инструмент командной строки, который запускается на удалённом рабочем столе или сервере. Чтобы установить его, скачайте его и добавьте в переменную PATH, чтобы его можно было запустить из любого каталога, в котором вы работаете.
Сначала скачайте соответствующий вашей операционной системе и архитектуре пакет с официальной страницы загрузок. Если вы используете macOS или Linux, вы можете скачать Terraform с помощью curl.
В macOS используйте эту команду для загрузки Terraform и размещения его в вашем домашнем каталоге:
curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.7.2/terraform_1.7.2_darwin_amd64.zipВ Linux используйте эту команду:
curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.7.2/terraform_1.7.2_linux_amd64.zipСоздайте папку ~/opt/terraform:
mkdir -p ~/opt/terraformЗатем распакуйте Terraform в папку ~/opt/terraform с помощью команды unzip. В Ubuntu вы можете установить unzip с помощью apt:
sudo apt install unzipИспользуйте его для извлечения загруженного архива в папку ~/opt/terraform, выполнив:
unzip ~/terraform.zip -d ~/opt/terraformНаконец, добавьте ~/opt/terraform в переменную среды PATH, чтобы можно было запустить команду terraform, не указывая полный путь к исполняемому файлу.
В Linux необходимо определить переменную PATH в файле bashrc., который выполняется при открытии новой оболочки. Откройте её для редактирования, выполнив следующую команду:
nano ~/.bashrcЧтобы добавить путь Terraform в PATH, добавьте следующую строку в конец файла:
export PATH=$PATH:~/opt/terraformПо завершении сохраните и закройте файл.
Теперь все ваши новые сеансы оболочки смогут найти команду terraform. Чтобы загрузить новый PATH в текущий сеанс, если вы используете Bash в системе Linux, выполните следующую команду:
. ~/.bashrcЕсли вы используете Bash на macOS, выполните следующую команду:
. .bash_profileЕсли вы используете ZSH, выполните эту команду:
. .zshrcЧтобы убедиться, что Terraform установлен правильно, выполните команду terraform без аргументов:
terraformВы увидите вывод, подобный следующему:
OutputUsage: 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 для взаимодействия с API DigitalOcean и управления ресурсами вашей учётной записи. Не передавайте этот ключ другим лицам и не используйте его в скриптах и системах контроля версий. Экспортируйте ваш персональный ключ доступа DigitalOcean в переменную среды DO_PAT, выполнив следующую команду:
export DO_PAT="your_personal_access_token"Создайте каталог, в котором будет храниться конфигурация вашей инфраструктуры, выполнив следующую команду:
mkdir ~/loadbalanceПерейдите в только что созданный каталог:
cd ~/loadbalanceКонфигурации Terraform — это текстовые файлы с расширением .tf. Они понятны человеку и поддерживают комментарии. (Terraform также поддерживает файлы конфигурации в формате JSON, но здесь они не рассматриваются.) Terraform считывает все файлы конфигурации в вашем рабочем каталоге декларативно, поэтому порядок определений ресурсов и переменных не имеет значения. Вся ваша инфраструктура может находиться в одном файле конфигурации, но для ясности следует разделять файлы конфигурации по типам ресурсов.
Первым шагом в создании инфраструктуры с помощью Terraform является определение поставщика, которого вы будете использовать.
Чтобы использовать провайдера DigitalOcean с Terraform, необходимо сообщить о нём Terraform и настроить плагин, указав соответствующие переменные учётных данных. Создайте файл provider.tf, в котором хранится конфигурация провайдера:
nano provider.tfДобавьте в файл следующие строки, чтобы сообщить Terraform, что вы хотите использовать поставщика DigitalOcean, а также указать Terraform, где его найти:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}Затем определите следующие переменные в файле, чтобы на них можно было ссылаться в остальных файлах конфигурации:
do_token: Ваш персональный пароль доступа к DigitalOcean.pvt_key: Расположение закрытого ключа, чтобы Terraform мог использовать его для входа в новые Droplets и установки Nginx.
Значения этих переменных передаются в Terraform при его запуске, а не прописываются здесь жёстко. Это делает конфигурацию более переносимой.
Чтобы определить эти переменные, добавьте в файл следующие строки:
...
variable "do_token" {}
variable "pvt_key" {}Затем добавьте эти строки для настройки провайдера DigitalOcean и назначьте свои учетные данные DigitalOcean. do_token К аргументу Токен Укажите поставщика:
...
provider "digitalocean" {
token = var.do_token
}Наконец, вам нужно, чтобы Terraform автоматически добавлял ваш SSH-ключ к любому новому создаваемому вами дроплету. При добавлении SSH-ключа в DigitalOcean вы дали ему имя. Terraform может использовать это имя для получения открытого ключа. Добавьте эти строки, заменив имя ключа, указанное в вашей учётной записи DigitalOcean. терраформировать Делать:
...
data "digitalocean_ssh_key" "terraform" {
name = "terraform"
}Файл провайдер.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"
}Инициализируйте Terraform для вашего проекта, выполнив:
terraform initЭта команда прочитает вашу конфигурацию и установит плагины для вашего провайдера. Вы увидите это в выводе:
OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.34.1...
- Installed digitalocean/digitalocean v2.34.1 (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
Вы можете создать дроплет DigitalOcean с помощью Terraform, а затем развернуть его и установить на нём программное обеспечение. На этом этапе вы подготовите Ubuntu 20.04 и установите веб-сервер Nginx с помощью Terraform.
Новый файл конфигурации Terraform, называемый www-1.tf Создайте файл, содержащий конфигурацию Droplet:
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 Указывает список открытых ключей, которые вы хотите добавить в Droplet. В этом случае вы указываете ключ, который находится в провайдер.tf Убедитесь, что имя здесь совпадает с именем, которое вы определили в провайдер.tf Вы указали, что должно совпадать.
При запуске Terraform с API DigitalOcean он собирает различную информацию о дроплете, например, его публичный и частный IP-адреса. Эта информация может использоваться другими ресурсами в вашей конфигурации.
Если вы не знаете, какие аргументы являются обязательными или необязательными для источника Droplet, обратитесь к официальной документации 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"
]
}
}Обратите внимание, что строки во встроенном массиве — это команды, которые пользователь 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. Теперь вам нужно развернуть Droplet точно так, как это определено.
Заказ план терраформирования Запустите, чтобы увидеть план выполнения или то, как Terraform будет создавать описанную вами инфраструктуру. Вам необходимо указать значения токена доступа DigitalOcean и путь к вашему закрытому ключу, так как ваша конфигурация будет использовать эту информацию для доступа к Droplet для установки Nginx. Чтобы создать план, выполните следующую команду:
terraform plan \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"Вы увидите вывод, подобный этому:
OutputTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# digitalocean_droplet.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 application, чтобы запустить текущее приложение:
terraform apply \
-var "do_token=${DO_PAT}" \
-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Введите «да» и нажмите Enter. Terraform Droplet предоставляет вам:
Outputdigitalocean_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 при каждом запуске плана или обновлении своего состояния.
Чтобы просмотреть текущее состояние вашей среды, используйте следующую команду:
terraform show terraform.tfstateЗдесь отображается публичный IP-адрес вашего Droplet.
Outputresource "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"
...Чтобы убедиться, что ваш сервер Nginx работает, перейдите по адресу http://your_www-1_server_ip в браузере.
На этом этапе вы развернули описанный вами Droplet в Terraform. Теперь вам нужно создать второй.
Шаг 5 — Создание второго сервера Nginx
Теперь, когда у вас настроен сервер Nginx, вы можете быстро добавить второй, скопировав существующий файл конфигурации сервера и заменив имя источника Droplet и имя хоста.
Вы можете сделать это вручную, но с помощью команды сед Чтобы прочитать файл www-1.tf, заменяя все экземпляры www-1 С www-2 и создайте новый файл под названием www-2.tf Это быстрее. Вот команда. сед Для этого есть:
sed 's/www-1/www-2/g' www-1.tf > www-2.tfДополнительную информацию об использовании sed можно найти в разделе Использование sed. сед Узнать больше.
Чтобы просмотреть изменения, которые внесет Terraform, запустите программу Terraform еще раз:
terraform plan \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"Вывод показывает, что Terraform создаст второй сервер www-2:
OutputTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# digitalocean_droplet.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 еще раз, чтобы создать второй дроплет:
terraform apply \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"Как и прежде, Terraform попросит вас подтвердить, что вы хотите продолжить. Ещё раз проверьте план и нажмите «Да», чтобы продолжить.
Через некоторое время Terraform создает новый сервер и отображает результаты:
Outputdigitalocean_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 Load Balancer, поддерживаемый официальным поставщиком Terraform.
Новый файл конфигурации Terraform, называемый loadbalancer.tf Создавать:
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.
Затем определите проверку статуса, чтобы убедиться, что балансировщик нагрузки действительно доступен после развертывания:
check "health_check" {
data "http" "lb_check" {
url = "http://${digitalocean_loadbalancer.www-lb.ip}"
}
assert {
condition = data.http.lb_check.status_code == 200
error_message = "${data.http.lb_check.url} returned an unhealthy status code"
}
}Эта проверка запрашивает статус IP-адреса балансировщика нагрузки по HTTP и подтверждает, что код возврата — 200, что означает работоспособность и доступность дроплетов. Если возникнут какие-либо ошибки или код возврата будет другим, после завершения развёртывания появится предупреждение. После завершения сохраните и закройте файл.
Заказать снова план терраформирования Запустите для проверки нового исполняемого файла:
terraform plan \
-var "do_token=${DO_PAT}" \
-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
<= read (data resources)
Terraform will perform the following actions:
# data.http.lb_check will be read during apply
# (config refers to values not yet known)
<= data "http" "lb_check" {
+ body = (known after apply)
+ id = (known after apply)
+ response_body = (known after apply)
+ response_body_base64 = (known after apply)
+ response_headers = (known after apply)
+ status_code = (known after apply)
+ url = (known after apply)
}
# 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
+ http_idle_timeout_seconds = (known after apply)
+ id = (known after apply)
+ ip = (known after apply)
+ name = "www-lb"
+ project_id = (known after apply)
+ 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
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
│ Warning: Check block assertion known after apply
│ on loadbalancer.tf line 27, in check "health_check":
│ 27: condition = data.http.lb_check.status_code == 200
│ ├────────────────
│ │ data.http.lb_check.status_code is a number
│
│ The condition could not be evaluated at this time, a result will be known when this plan is applied.
╵
...Поскольку капли www-1 и www-2 Они уже существуют, Terraform Load Balancer создает www-lb и проверяет его после предоставления.
Перед развертыванием необходимо перезапустить проект, чтобы добавить http-зависимость, используемую в health_check:
terraform init -upgradeЗатем запустите приложение terraform для создания балансировщика нагрузки:
terraform apply \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"Terraform снова предложит вам проверить план. Подтвердите выбор, нажав «Да», чтобы продолжить.
После этого вы увидите вывод, содержащий следующие строки, сокращенные для краткости:
Output...
digitalocean_loadbalancer.www-lb: Creating...
...
digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id]
data.http.lb_check: Reading...
data.http.lb_check: Read complete after 0s [id=http://lb-ip]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...Обратите внимание, что lb_check завершен успешно.
От terraform show terraform.tfstate Чтобы узнать IP-адрес вашего балансировщика нагрузки, используйте:
terraform show terraform.tfstateIP-адрес вы найдете в записи 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-домены. Например, если вы хотите привязать свой домен к балансировщику нагрузки, вы можете создать конфигурацию, описывающую эту связь.
Создайте новый файл для описания вашего DNS:
nano domain_root.tfДобавьте следующий источник домена, заменив your_domain на ваше доменное имя:
resource "digitalocean_domain" "default" {
name = "your_domain"
ip_address = digitalocean_loadbalancer.www-lb.ip
}По завершении сохраните и закройте файл.
Вы также можете добавить запись CNAME, которая www.ваш_домен к ваш_домен Создайте новый файл для записи CNAME:
nano domain_cname.tfДобавьте эти строки в файл:
resource "digitalocean_record" "CNAME-www" {
domain = digitalocean_domain.default.name
type = "CNAME"
name = "www"
value = "@"
}По завершении сохраните и закройте файл.
Для добавления записей DNS приложение терраформировать А потом приложение терраформинга Управляйте им, как любым другим ресурсом.
Перейдите по своему доменному имени, и вы увидите страницу приветствия Nginx, поскольку домен указывает на балансировщик нагрузки, который отправляет трафик на один из двух серверов Nginx.
Шаг 8 — Уничтожьте свою инфраструктуру
Хотя Terraform обычно не используется в производственных средах, он может разрушить существующую инфраструктуру. Это особенно полезно в средах разработки, которые развёртываются и уничтожаются многократно.
Во-первых, используя план терраформирования - уничтожить Разработать план реализации мероприятий по разрушению инфраструктуры:
terraform plan -destroy -out=terraform.tfplan \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"Terraform выводит план с ресурсами, выделенными красным цветом, с префиксом в виде знака «минус», указывающим на то, что он удалит ваши инфраструктурные ресурсы.
Тогда из приложение терраформинга Для реализации плана используйте:
terraform apply terraform.tfplanТерраформ продолжит уничтожать ресурсы, как указано в сгенерированном плане.
Результат
В этом руководстве вы использовали Terraform для создания веб-инфраструктуры с балансировкой нагрузки на платформе DigitalOcean, включающей два веб-сервера Nginx, работающих за балансировщиком нагрузки DigitalOcean. Вы узнали, как создавать и удалять ресурсы, просматривать текущее состояние и использовать Terraform для настройки DNS-записей.
Теперь, когда вы понимаете, как работает Terraform, вы можете создавать файлы конфигурации, описывающие серверную инфраструктуру для ваших проектов. Пример в этом руководстве — хорошая отправная точка для демонстрации того, как автоматизировать развёртывание серверов. Если вы уже используете инструменты подготовки, вы можете интегрировать их с Terraform для настройки серверов в процессе их создания, а не использовать метод подготовки, описанный в этом руководстве.
Terraform обладает множеством дополнительных функций и может работать с другими поставщиками. Подробнее об использовании Terraform для улучшения инфраструктуры можно узнать в официальной документации Terraform. Это руководство входит в серию «Управление инфраструктурой с помощью Terraform». В этой серии рассматривается ряд тем, связанных с Terraform: от первой установки Terraform до управления сложными проектами.









