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

Вступление

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

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

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

изображение: https: //assets.digitalocean.com/articles/terraform/terraform_example.png [Пример инфраструктуры]

Давайте посмотрим, что вам нужно, чтобы следовать этому уроку.

Предпосылки

Учетная запись DigitalOcean

Поскольку данное руководство ориентировано на использование поставщика Terraform DigitalOcean, вам потребуется действующая учетная запись DigitalOcean. Если у вас его нет, register здесь.

Токен API DigitalOcean

Создайте личный токен доступа через панель управления DigitalOcean. Инструкции для этого можно найти по этой ссылке: How для создания токена личного доступа.

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

export DO_PAT=

Terraform будет использовать этот токен для аутентификации в API DigitalOcean и для управления вашей учетной записью. Держите это в тайне!

Добавить SSH-ключ без пароля к облаку DigitalOcean

Если вы еще не добавили пароль SSH без пароля в свою учетную запись DigitalOcean, сделайте это, следуя https://www.digitalocean.com/community/tutorials/how-to-use-ssh-keys-with-digitalocean-droplets [этот урок].

Предполагая, что ваш закрытый ключ находится в + ~ / .ssh / id_rsa +, используйте следующую команду, чтобы получить отпечаток MD5 вашего открытого ключа:

ssh-keygen -E md5 -lf ~/.ssh/id_rsa.pub | awk '{print $2}'

Это выведет что-то вроде следующего:

md5:

Вам нужно будет предоставить этот отпечаток, за исключением префикса + md5: +, при запуске Terraform, например, (заменив все выделенные слова их соответствующими значениями):

terraform plan \
 -var "do_token=${DO_PAT}" \
 -var "pub_key=/.ssh/id_rsa.pub" \
 -var "pvt_key=/.ssh/id_rsa" \
 -var "ssh_fingerprint="

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

Установить Терраформ

  • Примечание: * Это руководство было написано с использованием Terraform 0.1.1.

Terraform очень прост в установке и может работать на вашем рабочем столе или на удаленном сервере. Вот шаги:

[[1-download-terraform]] ===== 1. Скачать Terraform

Загрузите соответствующий пакет для вашей ОС и архитектуры: Download Terraform

[[2-extract-terraform]] ===== 2. Извлечь Терраформ

Извлеките только что загруженный пакет в каталог по вашему выбору.

Если вы загрузили его в + ~ / Downloads +, вы можете запустить следующие команды для извлечения:

mkdir -p
unzip ~/Downloads/terraform_0.1.1_darwin_amd64.zip -d

Это разархивирует пакет в каталог + opt / terraform / + внутри вашего домашнего каталога.

[[3-add-path-to-profile]] ===== 3. Добавить путь к профилю

Последний шаг - добавить каталог bin Terraform, + ~ / opt / terraform / bin +, в переменную среды PATH для легкого доступа.

Например, если вы используете bash в качестве оболочки, вы можете добавить путь к вашему + .bash_profile +. Откройте свой профиль для редактирования:

vi ~/.bash_profile

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

export PATH=$PATH:

Сохранить и выйти.

Теперь все ваши новые сеансы bash смогут найти команду + terraform +. Если вы хотите загрузить новый PATH в текущий сеанс, введите следующее:

. .bash_profile

Проверьте установку Terraform

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

terraform

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

Available commands are:
   apply      Builds or changes infrastructure
   graph      Create a visual graph of Terraform resources
   output     Read an output from a state file
   plan       Generate and show an execution plan
   refresh    Update local state file against real resources
   show       Inspect Terraform state or plan
   version    Prints the Terraform version

Это команды, которые принимает Terraform. Их краткое описание описано здесь, но мы рассмотрим, как их использовать позже.

Теперь, когда Terraform установлен, давайте начнем писать конфигурацию для описания нашей инфраструктуры!

Создать каталог конфигурации

Первым шагом к созданию инфраструктуры с помощью Terraform является создание каталога, в котором будут храниться наши файлы конфигурации для данного проекта. Название каталога не имеет значения, но мы будем использовать «loadbalance» для примера (смело меняйте его имя):

mkdir

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

Измените ваш текущий каталог на новый созданный каталог:

cd

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

Если вы застряли

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

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

export TF_LOG=1

Кроме того, если вы не можете создать рабочую конфигурацию, полные файлы конфигурации доступны в следующем списке GitHub: Configuration Files.

Давайте перейдем к созданию конфигурации Terraform.

Создать конфигурацию провайдера

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

Создайте файл с именем + provider.tf +:

vi provider.tf

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

variable "do_token" {}
variable "pub_key" {}
variable "pvt_key" {}
variable "ssh_fingerprint" {}

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

Сохранить и выйти. Вот разбивка первых четырех строк:

  • * переменная «do_token» *: ваш персональный токен DigitalOcean

  • * переменная «pub_key» *: расположение открытого ключа, поэтому его можно установить в новые капли

  • * переменная «pvt_key» *: расположение закрытого ключа, поэтому Terraform может подключаться к новым капелькам

  • * переменная «ssh_fingerprint» *: отпечаток ключа SSH

В следующих строках указываются учетные данные для вашей учетной записи DigitalOcean путем назначения «токена» переменной do_token. Мы передадим значения этих переменных в Terraform при запуске.

Официальная документация Terraform поставщика DigitalOcean находится здесь: DigitalOcean Provider.

DigitalOcean Resources

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

  • * digitalocean_domain *: записи домена DNS

  • * digitalocean_droplet *: капли (т.е. VPS или серверы)

  • * digitalocean_record *: записи DNS

Начнем с создания капли, которая будет запускать сервер Nginx.

Опишите первый сервер Nginx

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

vi www-1.tf

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

resource "digitalocean_droplet" "www-1" {
   image = "ubuntu-14-04-x64"
   name = "www-1"
   region = "nyc2"
   size = "512mb"
   private_networking = true
   ssh_keys = [
     "${var.ssh_fingerprint}"
   ]

В приведенной выше конфигурации первая строка определяет ресурс digitalocean_droplet с именем «www-1». Остальные строки определяют атрибуты капли, к которым можно получить доступ через API DigitalOcean. Все остальное довольно очевидно, поэтому мы не будем объяснять каждую строку. Кроме того, Terraform будет собирать различную информацию о капле, такую ​​как ее публичные и частные IP-адреса, которые могут использоваться другими ресурсами в вашей конфигурации.

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

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

 connection {
     user = "root"
     type = "ssh"
     private_key = "${file(var.pvt_key)}"
     timeout = "2m"
 }

Эти строки описывают, как Terraform должен подключаться к серверу, в случае, если мы хотим обеспечить что-либо через SSH (обратите внимание на использование переменной личного ключа).

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

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

Сохранить и выйти.

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

Запустите Terraform для создания сервера Nginx

В настоящее время ваша конфигурация Terraform описывает один сервер Nginx. Давайте проверим это.

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

terraform init

Вы увидите этот вывод:

OutputInitializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...                                                           - Downloading plugin for provider "digitalocean" (0.1.2)...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.digitalocean: version = "~> 0.1"

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 plan +, чтобы увидеть, что Terraform попытается сделать для построения инфраструктуры, которую вы описали (т.е. см план выполнения). Вам нужно будет указать значения всех переменных, перечисленных ниже:

terraform plan \
 -var "do_token=${DO_PAT}" \
 -var "pub_key=/.ssh/id_rsa.pub" \
 -var "pvt_key=/.ssh/id_rsa" \
 -var "ssh_fingerprint="

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

Refreshing Terraform state prior to plan...
...
+ digitalocean_droplet.www-1
...

Зеленая строка ++ digitalocean_droplet.www-1 + означает, что Terraform создаст новый ресурс капельки под названием «www-1» с подробностями, которые следуют за ним. Это именно то, что мы хотим, так что давайте выполним план. Запустите следующую команду + terraform apply +, чтобы выполнить текущий план. Опять же, укажите все значения для переменных ниже:

terraform apply \
 -var "do_token=${DO_PAT}" \
 -var "pub_key=/.ssh/id_rsa.pub" \
 -var "pvt_key=/.ssh/id_rsa" \
 -var "ssh_fingerprint="

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

digitalocean_droplet.www-1: Creating...
...

digitalocean_droplet.www-1: Provisioning with 'remote-exec'...
digitalocean_droplet.www-1: Creation complete

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...

На этом этапе Terraform создал новую каплю с именем + www-1 + и установил на нее Nginx. Если вы посетите общедоступный IP-адрес вашей новой капли, вы увидите экран приветствия Nginx.

Опишите второй сервер Nginx

Теперь, когда вы описали сервер Nginx, очень легко добавить второй. Давайте просто скопируем исходный файл конфигурации и заменим имя (и имя хоста) ресурса droplet.

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

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

Теперь, если вы снова запустите + terraform plan + или + terraform apply +, он покажет или выполнит новый план соответственно. Поскольку мы уже знаем, что Terraform просто создаст еще одну каплю Nginx, давайте просто сохраним это на потом.

Давайте настроим нашу каплю HAProxy сейчас.

Опишите HAProxy сервер

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

vi haproxy-www.tf

Вставьте следующие строки, чтобы описать новую каплю. Первая часть идентична описаниям капель Nginx, за исключением того, что она имеет другое имя, «haproxy-www»:

resource "digitalocean_droplet" "haproxy-www" {
   image = "ubuntu-16-04-x64"
   name = "haproxy-www"
   region = "nyc2"
   size = "512mb"
   private_networking = true
   ssh_keys = [
     "${var.ssh_fingerprint}"
   ]

Вставьте следующую информацию о соединении (опять же, идентично каплям Nginx):

 connection {
     user = "root"
     type = "ssh"
     private_key = "${file(var.pvt_key)}"
     timeout = "2m"
 }

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

 provisioner "remote-exec" {
   inline = [
     "export PATH=$PATH:/usr/bin",
     # install haproxy 1.5
     "sudo add-apt-repository -y ppa:vbernat/haproxy-1.5",
     "sudo apt-get update",
     "sudo apt-get -y install haproxy",

     # download haproxy conf
     "sudo wget https://gist.githubusercontent.com/thisismitch/91815a582c27bd8aa44d/raw/8fc59b7cb88a2be9b802cd76288ca1c2ea957dd9/haproxy.cfg -O /etc/haproxy/haproxy.cfg",

     # replace ip address variables in haproxy conf to use droplet ip addresses
     "sudo sed -i 's/HAPROXY_PUBLIC_IP//g' /etc/haproxy/haproxy.cfg",
     "sudo sed -i 's/WWW_1_PRIVATE_IP//g' /etc/haproxy/haproxy.cfg",
     "sudo sed -i 's/WWW_2_PRIVATE_IP//g' /etc/haproxy/haproxy.cfg",

     # restart haproxy to load changes
     "sudo service haproxy restart"
   ]
 }
}

Сохранить и выйти.

Опять же, строки в массиве inline являются командами, которые root запускает для установки и настройки HAProxy. После установки HAProxy файл https://gist.githubusercontent.com/thisismitch/91815a582c27bd8aa44d/raw/8fc59b7cb88a2be9b802cd76288ca1c2ea957dd9/haproxy.cfg[sample haproxy.cfg загружается после установки HAProxy. На этом этапе команда + sed + заменяет определенные строки в файле конфигурации HAProxy соответствующими IP-адресами каждой капли, используя переменные Terraform (выделены красным цветом выше), поэтому HAProxy будет готов к запуску, как только это предусмотрено. Наконец, HAProxy перезапускается для загрузки изменений конфигурации.

В более практичном случае у вас может быть свой собственный файл haproxy.cfg в вашей системе Terraform, который вы можете скопировать на свой сервер с помощью средства «file».

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

Запустите Terraform для создания сервера HAProxy

В настоящее время ваша конфигурация Terraform описывает два сервера Nginx и сервер HAProxy. Давайте

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

terraform plan \
 -var "do_token=${DO_PAT}" \
 -var "pub_key=/.ssh/id_rsa.pub" \
 -var "pvt_key=/.ssh/id_rsa" \
 -var "ssh_fingerprint="

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

...
digitalocean_droplet.www-1: Refreshing state... (ID: 2236747)
...
+ digitalocean_droplet.haproxy-www
...
+ digitalocean_droplet.www-2
...

Это означает, что капля www-1 уже существует, и Terraform создаст капли haproxy-www и www-2. Давайте запустим + terraform apply +, чтобы собрать остальные компоненты:

terraform apply \
 -var "do_token=${DO_PAT}" \
 -var "pub_key=/.ssh/id_rsa.pub" \
 -var "pvt_key=/.ssh/id_rsa" \
 -var "ssh_fingerprint="

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

digitalocean_droplet.www-2: Creating...
...
digitalocean_droplet.www-2: Provisioning with 'remote-exec'...
digitalocean_droplet.www-2: Creation complete
...
digitalocean_droplet.haproxy-www: Creating...
...
digitalocean_droplet.haproxy-www: Provisioning with 'remote-exec'...
digitalocean_droplet.haproxy-www: Creation complete
...
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
...

На данный момент Terraform создал новый сервер Nginx и сервер HAProxy. Если вы посещаете общедоступный IP-адрес haproxy-www, вы должны увидеть экран приветствия Nginx (поскольку HAProxy балансирует нагрузку на два сервера Nginx).

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

Создание DNS-доменов и записей

Как упоминалось ранее, Terraform также может создавать домен DNS и регистрировать домены. Например, если вы хотите указать свой домен + example.com + на только что созданный сервер HAProxy, вы можете создать для этого конфигурацию Terraform. * Примечание: * Используйте свое собственное, уникальное доменное имя, иначе этот шаг не удастся, потому что (т.е. не используйте «example.com» или любые другие записи, которые уже существуют в DNS DigitalOcean)

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

vi

Вставьте следующий ресурс домена:

# Create a new domain record
resource "digitalocean_domain" "default" {
  name = ""
  ip_address = "${digitalocean_droplet.haproxy-www.ipv4_address}"
}

И пока мы это делаем, добавим запись CNAME, которая указывает «.example.com» на «example.com»:

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

Сохранить и выйти.

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

Другие команды Terraform

У Terraform есть несколько других команд, которые не были рассмотрены ранее, поэтому мы рассмотрим большинство из них здесь.

Показать состояние

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

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

terraform show terraform.tfstate

Обновить состояние

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

terraform refresh \
 -var "do_token=${DO_PAT}" \
 -var "pub_key=/.ssh/id_rsa.pub" \
 -var "pvt_key=/.ssh/id_rsa" \
 -var "ssh_fingerprint="

Уничтожить инфраструктуру

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

[[1-create-an-execution-plan-to-destroy-the-infrastructure]] ===== 1. Создайте план выполнения для уничтожения инфраструктуры:

terraform plan -destroy -out=terraform.tfplan \
 -var "do_token=${DO_PAT}" \
 -var "pub_key=/.ssh/id_rsa.pub" \
 -var "pvt_key=/.ssh/id_rsa" \
 -var "ssh_fingerprint="

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

[[2-apply-destroy]] ===== 2. Применить уничтожить:

terraform apply terraform.tfplan

Terraform уничтожит ресурсы, как указано в плане уничтожения.

Заключение

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

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

Related