Как использовать Terraform с вашей командой

Автор выбрал Фонд свободного и открытого исходного кода для получения пожертвования в рамках программы Напишите для DOnations.

Введение

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

Одним из таких удаленных бэкэндов является pg, который хранит состояние в базе данных PostgreSQL. В ходе этого руководства вы будете использовать его с Управляемой базой данных DigitalOcean, чтобы обеспечить доступность данных.

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

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

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

Примечание: Мы специально тестировали это руководство с использованием Terraform 1.1.3.

Хранение состояния в управляемой базе данных PostgreSQL

В этом разделе вы настроите проект, который развертывает Droplet и сохраняет состояние в базе данных DigitalOcean Managed PostgreSQL с использованием провайдера pg. Этот провайдер поддерживает блокировку состояния, чтобы состояние никогда не перезаписывалось двумя или более изменениями, происходящими одновременно.

Начните с создания каталога с именем terraform-team-pg, в котором вы будете сохранять проект:

  1. mkdir ~/terraform-team-pg

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

  1. cd ~/terraform-team-pg

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

  1. nano provider.tf

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

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

  backend "pg" {
    conn_str = "your_db_connection_string"
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Здесь вы требуете провайдера digitalocean и определяете бэкэнд pg, который принимает строку подключения. Затем вы определяете переменную do_token и передаете ее в экземпляр провайдера digitalocean.

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

Предупреждение: Для продолжения убедитесь, что в Настройках вашей базы данных, вы добавили IP-адрес машины, с которой вы запускаете Terraform, в белый список.

Инициализируйте проект, запустив:

  1. terraform init

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

Output
Initializing the backend... Successfully configured the backend "pg"! Terraform will automatically use this backend unless the backend configuration changes. 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! ...

Terraform успешно инициализировал бэкэнд, что означает, что он подключился к базе данных.

Затем определите Droplet в файле с именем droplets.tf. Создайте и откройте его для редактирования, запустив:

  1. nano droplets.tf

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

~/terraform-team-pg/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

Этот код развернет Droplet с именем web-1 в регионе fra1, работающий на Ubuntu 20.04 с 1 ГБ оперативной памяти и одним ядром CPU. Вам нужно только это определить, так что сохраните и закройте файл.

Вам понадобится ваш токен DigitalOcean в переменной среды. Создайте его, заменив your_do_token на свой токен:

  1. export DO_PAT="your_do_token"

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

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

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

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.web будет создан + resource "digitalocean_droplet" "web" { + 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 = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + 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. ...

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

Сохранение состояния в Terraform Cloud

На этом этапе вы создадите проект, который развертывает Droplet и использует Terraform Cloud в качестве своего бэкэнда с провайдером cloud. Это включает создание организации и рабочего пространства в Terraform Cloud, написание кода инфраструктуры и его планирование.

Создание организации

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

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

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

Затем вам будет предложено выбрать тип рабочего пространства.

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

Введите имя рабочего пространства по вашему выбору (назовем его sammy), затем нажмите Создать рабочее пространство, чтобы завершить процесс создания организации. Затем вы будете перенаправлены на страницу настроек рабочего пространства.

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

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

Затем нажмите кнопку Сохранить настройки, чтобы сохранить изменения.

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

Описание по умолчанию подходит, поэтому нажмите Создать токен API, чтобы создать его.

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

В командной строке выполните следующую команду для входа:

  1. terraform login

Вы получите следующий вывод:

Output
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. ...

Terraform предупреждает, что токен будет храниться локально. Введите yes, когда вас попросят:

Output
--------------------------------------------------------------------------------- Open the following URL to access the tokens page for app.terraform.io: https://app.terraform.io/app/settings/tokens?source=terraform-login --------------------------------------------------------------------------------- Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value:

Вставьте скопированный вами токен и подтвердите нажатием ENTER. Terraform покажет сообщение об успешном выполнении:

Output
... - ----- - --------- -- --------- - ----- --------- ------ ------- ------- --------- ---------- ---- ---------- ---------- -- ---------- ---------- Welcome to Terraform Cloud! - ---------- ------- --- ----- --- Documentation: terraform.io/docs/cloud -------- - ---------- ---------- --------- ----- - New to TFC? Follow these steps to instantly apply an example configuration: $ git clone https://github.com/hashicorp/tfc-getting-started.git $ cd tfc-getting-started $ scripts/setup.sh

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

Настройка проекта

Сначала создайте каталог с именем terraform-team-cloud, где вы будете хранить проект:

  1. mkdir ~/terraform-team-cloud

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

  1. cd ~/terraform-team-cloud

Для настройки проекта вам понадобится:

  • определить и настроить провайдера cloud, который взаимодействует с Terraform Cloud.
  • требуется провайдер digitalocean, чтобы иметь возможность развертывать ресурсы DigitalOcean.
  • определить и инициализировать переменные, которые вы будете использовать.

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

  1. nano provider.tf

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

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

  cloud {
    organization = "your_organization_name"

    workspaces {
      name = "your_workspace_name"
    }
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Здесь вы сначала указываете вашу версию Terraform. Затем вы указываете провайдер digitalocean как требуемый и устанавливаете бэкенд на cloud. Для organization и workspaces.name замените выделенные значения на указанные вами имена.

Затем вы определяете переменную с именем do_token, которую передаете созданному провайдеру digitalocean. Теперь ваш проект настроен на подключение к вашей организации, поэтому сохраните и закройте файл.

Инициализируйте свой проект следующей командой:

  1. terraform init

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

Output
Initializing Terraform Cloud... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.18.0... - Installed digitalocean/digitalocean v2.18.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 Cloud has been successfully initialized! ...

Поскольку определение Droplet такое же, как и в предыдущем проекте, вы можете скопировать его, запустив:

  1. cp ../terraform-team-pg/droplets.tf .

Наконец, вы определите значения переменных. Провайдер cloud не поддерживает передачу значений переменных через командную строку, поэтому вам придется передавать их с помощью файлов переменных или устанавливать их в Terraform Cloud. Terraform считывает значения переменных из файлов с именем, заканчивающимся на .auto.tfvars. Создайте и откройте файл с именем vars.auto.tfvars для редактирования, в котором вы определите переменную do_token:

  1. nano vars.auto.tfvars

Добавьте следующую строку, заменив your_do_token на свой токен API DigitalOcean:

vars.auto.tfvars
do_token = "your_do_token"

После завершения сохраните и закройте файл. Terraform автоматически считает этот файл при планировании действий.

Ваш проект теперь завершен и настроен для использования Terraform Cloud в качестве своего бэкэнда. Теперь вы можете запланировать и применить Droplet и рассмотреть, как это отражается в приложении Cloud.

Применение конфигурации

На Шаге 1 этого руководства вы запланировали проект, используя команду terraform plan. Поскольку у Terraform Cloud проект имеет те же ресурсы, вы можете пропустить его повторное планирование и применить его непосредственно к Terraform Cloud.

Примените проект, запустив следующую команду для его обновления:

  1. terraform apply

Вы заметите, что вывод отличается от того, который вы получаете, используя local в качестве своего бэкенда:

Output
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C will cancel the remote apply if it's still pending. If the apply started it will stop streaming the logs, but will not stop the apply running remotely. Preparing the remote apply... To view this run in a browser, visit: https://app.terraform.io/app/sammy-shark/sammy/runs/run-euVu9t1yUtuq5sy9 Waiting for the plan to start... Terraform v1.1.3 on linux_amd64 Configuring remote state backend... Initializing Terraform configuration... 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.web будет создан + resource "digitalocean_droplet" "web" { + 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 = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + 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. ...

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

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

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

  1. terraform destroy

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

Вывод

В этом руководстве вы использовали два различных бэкенда: Terraform Cloud, который является управляемым облачным предложением Hashicorp для Terraform; и pg, который позволяет сохранять состояние проекта в базе данных PostgreSQL. Вы использовали управляемую базу данных PostgreSQL от DigitalOcean, которую можно развернуть и использовать с Terraform всего за несколько минут.

Для получения дополнительной информации о функциях Terraform Cloud посетите официальную документацию.

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-within-your-team