Введение
Terraform – это инструмент для построения и управления инфраструктурой в организованном порядке. Вы можете использовать его для управления цифровыми каплями DigitalOcean, балансировщиками нагрузки, а также записями DNS, помимо большого разнообразия услуг, предлагаемых другими поставщиками. Terraform использует интерфейс командной строки и может запускаться с вашего рабочего стола или удаленного сервера.
Terraform работает путем чтения файлов конфигурации, описывающих компоненты, составляющие ваше окружение приложения или центра обработки данных. На основе конфигурации он генерирует план выполнения, который описывает, что он сделает, чтобы достичь желаемого состояния. Затем вы используете Terraform для выполнения этого плана построения инфраструктуры. При изменении конфигурации Terraform может генерировать и выполнять инкрементальные планы для обновления существующей инфраструктуры до вновь описанного состояния.
В этом руководстве вы установите Terraform и используете его для создания инфраструктуры на DigitalOcean, состоящей из двух серверов Nginx, балансируемых балансировщиком нагрузки DigitalOcean. Затем вы будете использовать Terraform для добавления записи DNS на DigitalOcean, которая будет указывать на ваш балансировщик нагрузки. Это поможет вам начать использовать Terraform и даст представление о том, как вы можете использовать его для управления и развертывания инфраструктуры, основанной на DigitalOcean, которая соответствует вашим собственным потребностям.
Примечание: Это руководство было протестировано с Terraform 1.1.3
.
Предварительные условия
Для завершения этого руководства вам понадобятся:
- A DigitalOcean account. If you do not have one, sign up for a new account.
- A DigitalOcean Personal Access Token, which you can create via the DigitalOcean control panel. Instructions to do that can be found at: How to Create a Personal Access Token.
- A password-less SSH key added to your DigitalOcean account, which you can create by following How To Use SSH Keys with DigitalOcean Droplets. When you add the key to your account, remember the name you give it, as you’ll need it in this tutorial. (For Terraform to accept the name of your key, it must start with a letter or underscore and may contain only letters, digits, underscores, and dashes.)
- A personal domain pointed to DigitalOcean’s nameserver, which you can do by following the tutorial, How To Point to DigitalOcean Nameservers From Common Domain Registrars.
Шаг 1 — Установка Terraform
Terraform – это инструмент командной строки, который вы запускаете на своем рабочем столе или на удаленном сервере. Чтобы установить его, вам нужно загрузить и разместить его в своем каталоге PATH
, чтобы можно было выполнять его в любом рабочем каталоге.
Сначала загрузите соответствующий пакет для вашей ОС и архитектуры с официальной страницы загрузок. Если вы используете macOS или Linux, вы можете загрузить Terraform с помощью curl
.
На macOS используйте эту команду для загрузки Terraform и размещения его в вашем домашнем каталоге:
На Linux используйте эту команду:
Создайте каталог ~/opt/terraform
:
Затем разархивируйте Terraform в ~/opt/terraform
, используя команду unzip
. На Ubuntu вы можете установить unzip
с помощью apt
:
Используйте его для извлечения загруженного архива в каталог ~/opt/terraform
, запустив:
Наконец, добавьте ~/opt/terraform
в вашу переменную среды PATH
, чтобы вы могли выполнять команду terraform
без указания полного пути к исполняемому файлу.
На Linux вам потребуется переопределить переменную PATH
в файле .bashrc
, который запускается при открытии нового оболочечного сеанса. Откройте его для редактирования, запустив:
Примечание: На macOS добавьте путь к файлу .bash_profile
, если используете Bash, или к .zshrc
, если используете ZSH.
Чтобы добавить путь Terraform в вашу переменную PATH, добавьте следующую строку в конец файла:
Сохраните и закройте файл, когда закончите.
Теперь все новые оболочечные сеансы смогут найти команду terraform
. Чтобы загрузить новое значение переменной PATH в текущий сеанс, выполните следующую команду, если используете Bash на Linux:
Если вы используете Bash на macOS, выполните вместо этого эту команду:
Если вы используете ZSH, выполните эту команду:
Чтобы убедиться, что 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: Droplets (серверы)
- digitalocean_loadbalancer: Балансировщики нагрузки
- digitalocean_domain: Записи доменов DNS
- digitalocean_record: Записи DNS
Terraform будет использовать ваш персональный токен доступа к DigitalOcean для общения с API DigitalOcean и управления ресурсами в вашей учетной записи. Не передавайте этот ключ другим и храните его вне скриптов и системы контроля версий. Экспортируйте ваш персональный токен доступа к DigitalOcean в переменную среды с именем DO_PAT
, выполнив следующую команду:
Это упростит его использование в последующих командах и сохранит его отдельно от вашего кода.
Примечание: Если вы часто будете работать с Terraform и DigitalOcean, добавьте эту строку в ваши файлы конфигурации оболочки, используя тот же подход, который вы использовали для изменения вашей переменной среды PATH
на предыдущем шаге.
Создайте каталог, который будет содержать конфигурацию вашей инфраструктуры, выполнив следующую команду:
Перейдите в новый созданный каталог:
Конфигурации Terraform – это текстовые файлы с расширением файла .tf
. Они читаемы для человека и поддерживают комментарии. (Terraform также поддерживает файлы конфигурации в формате JSON, но они не будут рассматриваться здесь.) Terraform будет читать все файлы конфигурации в вашем рабочем каталоге декларативно, поэтому порядок определений ресурсов и переменных не имеет значения. Вся ваша инфраструктура может существовать в одном файле конфигурации, но вы должны разделять файлы конфигурации по типу ресурсов для обеспечения ясности.
Первый шаг к построению инфраструктуры с помощью Terraform – определить провайдера, который вы собираетесь использовать.
Чтобы использовать провайдера DigitalOcean с Terraform, вам нужно сообщить Terraform об этом и настроить плагин с правильными переменными учетных данных. Создайте файл с именем provider.tf
, который будет содержать конфигурацию для провайдера:
Добавьте следующие строки в файл, чтобы сообщить Terraform, что вы хотите использовать провайдера DigitalOcean, и указать Terraform, где его найти:
Затем определите следующие переменные в файле, чтобы вы могли ссылаться на них в остальных файлах вашей конфигурации:
do_token
: ваш персональный токен доступа к DigitalOcean.pvt_key
: расположение закрытого ключа, чтобы Terraform мог использовать его для входа на новые узлы и установки Nginx.
Вы передадите значения этих переменных в Terraform при его запуске, а не жестко закодируете их здесь. Это делает конфигурацию более переносимой.
Чтобы определить эти переменные, добавьте эти строки в файл:
Затем добавьте эти строки для настройки провайдера DigitalOcean и укажите учетные данные для вашей учетной записи DigitalOcean, присвоив do_token
аргументу token
провайдера:
Наконец, вы захотите, чтобы Terraform автоматически добавил ваш ключ SSH на любые новые узлы, которые вы создаете. Когда вы добавили свой ключ SSH в DigitalOcean, вы дали ему имя. Terraform может использовать это имя для получения открытого ключа. Добавьте эти строки, заменив terraform
именем ключа, которое вы указали в своей учетной записи DigitalOcean:
Ваш завершенный файл provider.tf
будет выглядеть так:
Когда закончите, сохраните и закройте файл.
Примечание: Установка переменной среды TF_LOG
равной 1
включит подробное ведение журнала того, что пытается сделать Terraform. Вы можете установить его, выполнив:
Инициализируйте Terraform для вашего проекта, выполнив:
Это прочтет вашу конфигурацию и установит плагины для вашего провайдера. Вы увидите это залогировано в выводе:
OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.16.0...
- Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Если у вас возникли проблемы, и Terraform не работает так, как вы ожидаете, вы можете начать заново, удалив файл terraform.tfstate
и вручную уничтожив созданные ресурсы (например, через панель управления).
Terraform теперь настроен и может быть подключен к вашей учетной записи DigitalOcean. На следующем этапе вы будете использовать Terraform для определения Droplet, который будет запускать сервер Nginx.
Шаг 3 — Определение первого сервера Nginx
Вы можете использовать Terraform для создания Droplet DigitalOcean и установки программного обеспечения на Droplet после его запуска. На этом этапе вы будете предоставлять один Droplet Ubuntu 20.04 и устанавливать веб-сервер Nginx с использованием Terraform.
Создайте новый файл конфигурации Terraform с именем www-1.tf
, который будет содержать конфигурацию Droplet:
Вставьте следующие строки, чтобы определить ресурс Droplet:
В предшествующей конфигурации первая строка определяет ресурс digitalocean_droplet с именем www-1
. Остальные строки указывают атрибуты Droplet, включая центр данных, в котором он будет находиться, и слаг, который идентифицирует размер Droplet, который вы хотите настроить. В этом случае вы используете s-1vcpu-1gb
, который создаст Droplet с одним CPU и 1 ГБ оперативной памяти. (Посетите эту таблицу слагов размеров, чтобы увидеть доступные слаги, которые вы можете использовать.)
Раздел ssh_keys
определяет список открытых ключей, которые вы хотите добавить к Droplet. В этом случае вы указываете ключ, который определен в provider.tf
. Убедитесь, что имя здесь совпадает с именем, указанным в provider.tf
.
Когда вы запускаете Terraform против API DigitalOcean, он собирает различную информацию о Droplet, такую как его общедоступный и частный IP-адреса. Эту информацию можно использовать другими ресурсами в вашей конфигурации.
Если вы задаетесь вопросом, какие аргументы обязательны или необязательны для ресурса Droplet, пожалуйста, обратитесь к официальной документации Terraform: Спецификация Droplet в DigitalOcean.
Чтобы настроить connection
, которое Terraform может использовать для подключения к серверу по SSH, добавьте следующие строки в конце файла:
Эти строки описывают, как Terraform должен подключаться к серверу, так что Terraform может подключиться через SSH для установки Nginx. Обратите внимание на использование переменной закрытого ключа var.pvt_key
– вы передадите ее значение при запуске Terraform.
Теперь, когда у вас настроено подключение, настройте предоставитель remote-exec
, который вы будете использовать для установки Nginx. Добавьте следующие строки в конфигурацию, чтобы сделать это:
Обратите внимание, что строки в массиве inline
– это команды, которые пользователь root будет выполнять для установки Nginx.
Завершенный файл выглядит так:
Сохраните файл и выйдите из редактора. Вы определили сервер и готовы развернуть его, что вы сейчас и сделаете.
Шаг 4 — Использование Terraform для создания сервера Nginx
Ваша текущая конфигурация Terraform описывает один сервер Nginx. Теперь вы развернете Droplet точно так, как он определен.
Запустите команду terraform plan
, чтобы увидеть план выполнения или то, что Terraform попытается сделать, чтобы построить инфраструктуру, которую вы описали. Вам придется указать значения для вашего токена доступа DigitalOcean и пути к вашему закрытому ключу, так как ваша конфигурация использует эту информацию для доступа к вашему Droplet для установки Nginx. Запустите следующую команду, чтобы создать план:
Предупреждение: Команда terraform plan
поддерживает параметр -out
для сохранения плана. Однако план будет хранить ключи API, и Terraform не шифрует эти данные. При использовании этой опции вы должны рассмотреть возможность шифрования этого файла, если планируете отправить его другим или оставить его в покое на длительное время.
Вы увидите вывод, аналогичный следующему:
Строка + resource "digitalocean_droplet" "www-1"
означает, что Terraform создаст новый ресурс Droplet с именем www-1
и указанными деталями. Это и должно произойти, поэтому выполните команду terraform apply
, чтобы выполнить текущий план:
Вы получите тот же вывод, что и раньше, но на этот раз Terraform спросит вас, хотите ли вы продолжить:
Output...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Введите yes
и нажмите ENTER
. Terraform настроит ваш Droplet:
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 создал новый Droplet с именем www-1
и установил на него Nginx. Если вы перейдете по публичному IP-адресу вашего нового Droplet, вы увидите приветственный экран Nginx. Публичный IP-адрес был отображен при создании Droplet, но вы всегда можете посмотреть его, просматривая текущее состояние Terraform. Terraform обновляет файл состояния terraform.tfstate
каждый раз, когда выполняет план или обновляет свое состояние.
Чтобы просмотреть текущее состояние вашей среды, используйте следующую команду:
Это покажет вам публичный IP-адрес вашего Droplet.
Перейдите по адресу http://your_www-1_server_ip
в вашем браузере, чтобы убедиться, что ваш сервер Nginx работает.
Примечание: Если вы изменяете свою инфраструктуру вне Terraform, ваш файл состояния будет устаревшим. Если ваши ресурсы изменены вне Terraform, вам потребуется обновить файл состояния, чтобы привести его в актуальное состояние. Эта команда извлечет обновленную информацию о ресурсах у ваших провайдеров:
На этом этапе вы развернули Droplet, который описали в Terraform. Теперь вы создадите второй.
Шаг 5 — Создание второго сервера Nginx
Теперь, когда вы описали сервер Nginx, вы можете быстро добавить второй, скопировав существующий файл конфигурации сервера и заменив имя и имя хоста ресурса Droplet.
Вы можете сделать это вручную, но быстрее использовать команду sed
для чтения файла www-1.tf
, замены всех вхождений www-1
на www-2
и создания нового файла с именем www-2.tf
. Вот команда sed
для этого:
Вы можете узнать больше о sed
, посетив Использование sed.
Запустите terraform plan
еще раз, чтобы просмотреть изменения, которые сделает Terraform:
Вывод показывает, что Terraform создаст второй сервер, www-2
:
Запустите terraform apply
снова, чтобы создать второй экземпляр Droplet:
Как и ранее, Terraform попросит вас подтвердить свое желание продолжить. Пересмотрите план еще раз и введите yes
, чтобы продолжить.
Через некоторое время 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, который поддерживается официальным провайдером Terraform, чтобы маршрутизировать трафик между двумя веб-серверами.
Создайте новый файл конфигурации Terraform с именем loadbalancer.tf
:
Добавьте следующие строки, чтобы определить Балансировщик нагрузки:
Определение Балансировщика нагрузки указывает его имя, дата-центр, на котором он будет находиться, порты, на которых он должен слушать трафик для балансировки, конфигурацию для проверки состояния здоровья, а также идентификаторы Droplet’ов, которые он должен балансировать, их можно получить, используя переменные Terraform. Сохраните и закройте файл.
Запустите команду terraform plan
снова, чтобы просмотреть новый план выполнения:
Вы увидите несколько строк вывода, включая следующие строки:
Это означает, что Droplets www-1
и www-2
уже существуют, и Terraform создаст Load Balancer www-lb
.
Запустите terraform apply
, чтобы создать Load Balancer:
Еще раз 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-адрес вашего балансировщика нагрузки:
Вы найдете IP-адрес под записью www-lb
:
Перейдите по адресу http://ваш_адрес_балансировщика_нагрузки
в вашем браузере, и вы увидите приветственный экран Nginx, потому что балансировщик нагрузки направляет трафик на один из двух серверов Nginx.
Теперь вы узнаете, как настроить DNS для вашей учетной записи DigitalOcean с использованием Terraform.
Шаг 7 — Создание DNS-доменов и записей
Помимо Droplets и балансировщиков нагрузки, Terraform также может создавать домены DNS и записи доменов. Например, если вы хотите направить свой домен на балансировщик нагрузки, вы можете написать конфигурацию, описывающую эту связь.
Примечание: Используйте собственное уникальное доменное имя, иначе Terraform не сможет развернуть ресурсы DNS. Убедитесь, что ваш домен указан на имена серверов DigitalOcean.
Создайте новый файл для описания вашего DNS:
Добавьте следующий ресурс домена, заменив your_domain
на ваше доменное имя:
Сохраните и закройте файл, когда закончите.
Вы также можете добавить запись CNAME, которая указывает www.your_domain
на your_domain
. Создайте новый файл для записи CNAME:
Добавьте эти строки в файл:
Сохраните и закройте файл, когда закончите.
Чтобы добавить DNS-записи, выполните terraform plan
, а затем terraform apply
, как и для других ресурсов.
Перейдите на ваше доменное имя, и вы увидите приветственный экран Nginx, потому что домен указывает на балансировщик нагрузки, который отправляет трафик на один из двух серверов Nginx.
Шаг 8 — Уничтожение вашей инфраструктуры
Хотя Terraform не является широко используемым в производственных средах, он также может уничтожать инфраструктуру, которую создал. Это в основном полезно в средах разработки, которые разворачиваются и уничтожаются несколько раз.
Сначала создайте план выполнения для уничтожения инфраструктуры, используя terraform plan -destroy
:
Terraform выведет план с ресурсами, отмеченными красным цветом и предваренными знаком минус, что указывает на удаление ресурсов в вашей инфраструктуре.
Затем используйте terraform apply
для выполнения плана:
Terraform приступит к уничтожению ресурсов, как указано в сгенерированном плане.
Заключение
В этом руководстве вы использовали Terraform для создания сбалансированной нагрузки веб-инфраструктуры на DigitalOcean с двумя веб-серверами Nginx, работающими за балансировщиком нагрузки DigitalOcean. Теперь вы знаете, как создавать и уничтожать ресурсы, просматривать текущее состояние и использовать Terraform для настройки DNS-записей.
Теперь, когда вы понимаете, как работает Terraform, вы можете создавать файлы конфигурации, описывающие серверную инфраструктуру для своих собственных проектов. Приведенный в этом руководстве пример является хорошей отправной точкой, который демонстрирует, как вы можете автоматизировать развертывание серверов. Если вы уже используете инструменты предоставления, вы можете интегрировать их с Terraform для настройки серверов в рамках их процесса создания, а не использовать метод предоставления, используемый в этом руководстве.
Terraform имеет еще больше функций и может работать с другими провайдерами. Посмотрите официальную документацию по Terraform, чтобы узнать больше о том, как вы можете использовать Terraform для улучшения вашей собственной инфраструктуры.
Этот учебник является частью серии Как управлять инфраструктурой с помощью Terraform. В серии рассматривается ряд тем по Terraform, от установки Terraform впервые до управления сложными проектами.
Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean