Экспертный материал
Михаил Ястребов | Системный администратор
Одним из самых популярных инструментов для развертывания множества виртуальных машин в облаке является Terraform. Давайте рассмотрим, что это такое и зачем он нужен.
Terraform – это инструмент для развертывания инфраструктуры в коде. Фактически это язык программирования инфраструктуры, позволяющий в кратчайшие сроки развернуть группу виртуальных машин в большинстве популярных облачных провайдеров (Yandex, Google, Amazon, Alibaba, Microsoft, VMware) и выполнить необходимые базовые настройки сети.
Terraform выделяется на фоне большинства подобных инструментов благодаря ряду преимуществ:
Высокая скорость развертывания тенантов (они же – пользовательские виртуальные среды). Обычно чем больше клиентов, тем выше нагрузка на техподдержку, которая отвечает за публикацию новых ресурсов. С Terraform же пользователи сами меняют параметры виртуальных машин без привлечения инженеров.
Моментальная проверка плана активации теннанта. С помощью описания кода инфраструктуры можно сразу же уточнить всю информацию о состоянии виртуальной машины.
Управление ресурсами в большинстве популярных облаков: от Yandex, Google, Amazon, Alibaba, Microsoft до частных платформ на базе VMware vCloud Director, предлагающих услуги IaaS, SaaS и PaaS.
Управление сразу несколькими облаками. Для повышения отказоустойчивости можно распространять инфраструктуру между платформами, используя лишь одну конфигурацию для создания, диагностики и настройки.
Удобное создания демо-стендов для тестирования и отладки ПО. Можно параллельно проверять ПО в разных средах, моментально изменять и удалять ресурсы лишь с одним планом построения ресурсов.
Если вы используете другую среду виртуализации, вы можете самостоятельно написать файл конфигурации для вашей инфраструктуры.
Подготовка облака для работы с Terraform
Для работы с Terraform вам понадобится логин и пароль администратора вашего аккаунта, точки входа Api и Provider файл, который вы можете скачать у своего облачного провайдера или на официальном сайте Terraform .
Мы будем использовать VMware Cloud Director Provider, с которым можно ознакомиться по ссылке.
Для добавления provider внесите в манифест (например, файл main.tf) строки указанные «use provider».
Данные ресурсы не доступны без VPN на территории РФ.
Установка Terraform для разных OS
Установка Terraform на Windows
Перейдите на сайт https://www.terraform.io/downloads
Выберите Windows и скачайте исполнительный файл Terraform.
Скопируйте скачанный файл в директорию, из которой вы планируете его запускать.
Перейдите в System Variables (Панель управления --> Система --> Дополнительные параметры системы --> Переменные среды) и укажите папку, в которой расположен .exe файл Terraform.
Установка Terraform на macOS
Для установки в macOS по упрощённому сценарию предварительно установите Homebrew введя команду
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)
Выполните команду «brew update»
brew tap hashicorp/tap brew install hashicorp/tap/terraform
Установка terraform на Linux
Для ubuntu/Debian
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install terraform
Centos
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install terraform
Fedora
sudo dnf install -y dnf-plugins-core sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo sudo dnf -y install terraform
Amazon linux
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo sudo yum -y install terraform
Или можно так же воспользоваться пакетным менеджером Homebrew:
brew tap hashicorp/tap brew install hashicorp/tap/terraform
Инструкции по установке для других операционных систем вы можете найти на сайте www.terraform.io в разделе downloads.
Настраиваем конфигурацию
При необходимости обновите Terraform. Для этого достаточно заменить файл Terraform на более позднюю версию в папке его расположения. На операционных системах macOs можно выполнить команду «brew update terraform» .
Выберите удобный для вас текстовый редактор, для написания файла конфигурации. Это может быть стандартный Блокнот, Notepad++, Atom, TextEdit, Vi, Vim, Nano, а также любая IDE с модулями для Terraform, упрощающие написание кода, как Visual Studio Code и другие.
Для подключения к инфраструктуре создайте файлmain.tf со следующим содержимым:
provider "vcd" { user = "ваш пользователь в vcd" password = "ваш пароль" org = "название организации в vcd org-organization" url = "https://vcd.combocloud.ru/cloudapi" }
Выполните команду «terraform init» и Terraform скачает все необходимые файлы для работы. (Команду необходимо выполнять с включенным VPN).
terraform init Initializing the backend... Initializing provider plugins... - Reusing previous version of vmware/vcd from the dependency lock file - Using previously-installed vmware/vcd v3.4.0 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.
Вы увидите сообщение следующего содержания. Это значит, что Provider файл обновлен успешно.
Выполните команду «terraform plan» и вы увидите какие ресурсы будут созданы или удалены Terraform.
terraform plan 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: # vcd_vapp.terraform will be created + resource "vcd_vapp" "terraform" { + href = (known after apply) + id = (known after apply) + name = "terraform" + power_on = false + status = (known after apply) + status_text = (known after apply) } # vcd_vapp_org_network.terraform-net will be created + resource "vcd_vapp_org_network" "terraform-net" { + id = (known after apply) + is_fenced = false + org_network_name = "LAN-Yastrebov" + retain_ip_mac_enabled = false + vapp_name = "terraform" } # vcd_vapp_vm.centos7 will be created + resource "vcd_vapp_vm" "centos7" { + accept_all_eulas = true + catalog_name = "Templates" + computer_name = (known after apply) + cpu_cores = (known after apply) + cpu_hot_add_enabled = false + cpus = 4 + description = (known after apply) + expose_hardware_virtualization = false + hardware_version = (known after apply) + href = (known after apply) + id = (known after apply) + internal_disk = (known after apply) + memory = 2048 + memory_hot_add_enabled = false + name = "centos7" + os_type = (known after apply) + power_on = true + prevent_update_power_off = false + sizing_policy_id = (known after apply) + storage_profile = (known after apply) + template_name = "CentOS-7-x86_64-minimal" + vapp_name = "terraform" + vm_type = (known after apply) + customization { + admin_password = (sensitive value) + allow_local_admin_password = (known after apply) + auto_generate_password = (known after apply) + change_sid = (known after apply) + enabled = (known after apply) + force = (known after apply) + initscript = (known after apply) + join_domain = (known after apply) + join_domain_account_ou = (known after apply) + join_domain_name = (known after apply) + join_domain_password = (sensitive value) + join_domain_user = (known after apply) + join_org_domain = (known after apply) + must_change_password_on_first_login = (known after apply) + number_of_auto_logons = (known after apply) } + network { + adapter_type = (known after apply) + connected = true + ip = (known after apply) + ip_allocation_mode = "POOL" + is_primary = (known after apply) + mac = (known after apply) + name = "LAN-Yastrebov" + type = "org" } } Plan: 3 to add, 0 to change, 0 to destroy. ─────────────────────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't
Подготавливаем план инфраструктуры и сценарий использования
Под планом инфраструктуры в данном описании будет подразумеваться создание одной тестовой ВМ, подключенной к сети. Для примера, создадим vApp и ВМ. Для этого в том же файле main.tf можно дописать следующее:
Создадим vApp
#Create vApp terraform resource "vcd_vapp" "terraform" { name = "terraform" metadata = { } }
Подключим vapp к сети
resource "vcd_vapp_org_network" "terraform-net" { vapp_name = vcd_vapp.terraform.name org_network_name = "имя routed сети" }
Создадим vm
resource "vcd_vapp_vm" "centos7" { vapp_name = "укажите имя vapp" name = "centos7" catalog_name = "Templates" template_name = "CentOS-7-x86_64-minimal" memory = 2048 cpus = 2 network { name = "LAN-Yastrebov" type = "org" ip_allocation_mode = "POOL" } }
Выполнив команду «terraform apply», вы получите следующий результат:
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Что означает успешное выполнение команды 1 ресурс создан, 0 изменено и 0 удалено. После выполнения данной команды в Cloud Director создалась 1 виртуальная машина с указанными параметрами: 2 CPU, 2048 оперативная память в указанном в параметрах vApp и IP адресом полученным из пула сети в вашем облаке.
Для удаления ресурсов введите команду «terraform destroy»
Данная команда удалит всю вашу инфраструктуру с помощью Terraform. Все сервера, что вы создали ранее с помощью Terraform, будут удалены. Для частичного удаления ресурсов используйте Terraform Count в файле конфигурации. (Данное решение может быть изложено в дальнейшем).
После проделанных манипуляций в Cloud Director была создана 1 виртуальная машина с указанными параметрами: 2 CPU, 2048 оперативная память в указанном в параметрах vApp.
В облаке Сorpsoft24, как и у большинства популярных облачных провайдеров, вы можете использовать Terraform для быстрого развертывания инфраструктуры или ее свертывания. Terraform позволяет мгновенно создать, трансформировать или уничтожить инфраструктуру.