Практическая работа. Создаём виртуальную машину из образа и базу данных
Кратко:
- Создание кластера PostgreSQL с помощью Terraform и Yandex Cloud.
- Установка и настройка Terraform для работы с Yandex Cloud.
- Создание виртуальной машины и базы данных с использованием образа, созданного с помощью Packer.
- Использование переменных в спецификации Terraform для создания разных конфигураций.
- Создание сети и подсети с использованием Yandex Cloud.
- Применение обновленной спецификации для создания кластера PostgreSQL.
- Удаление инфраструктуры с использованием Terraform.
Практическая работа. Создаём виртуальную машину из образа и базу данных
В этой практической работе вы установите Terraform и подготовите спецификацию, с помощью которой создадите виртуальную машину, а затем управляемую базу данных.
Подсказки для создания спецификации смотрите в документации Yandex Cloud и в справочнике ресурсов (раздел Resources).
-
Установите Terraform. Дистрибутив для вашей платформы можно скачать из зеркала. После загрузки добавьте путь к папке, в которой находится исполняемый файл, в переменную
PATH.Настройте провайдер.Для Linux: Скачать бинарный файл сдесь.Распоковать в папку /home/administrator/terraform. Перейти в папку cd /home/administrator/terraform Переместите распакованный файл в папку /usr/local/bin: sudo mv terraform /usr/local/bin/ Установите разрешения chmod +x /usr/local/bin/terraform Проверьте установку Terraform terraform version Настройка переменных среды echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc source ~/.bashrc -
Создайте файл спецификации
my-config.tfи укажите в нём Yandex Cloud в качестве провайдера.terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } } provider "yandex" { token = "<OAuth-токен>" cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" zone = "<зона_доступности_по_умолчанию>" }Далее мы будем считать, что в качестве зоны доступности по умолчанию выбранаru-central1-a. -
Добавьте в файл блок, описывающий создание ВМ. Его сложно написать с нуля, поэтому опирайтесь на пример из документации. Чтобы вам было проще опознать в консоли управления объекты, созданные по этой спецификации, указывайте уникальные имена для ВМ, сети и подсети, а не оставляйте имена по умолчанию (default).
-
Для создания ВМ используйте образ, созданный с помощью Packer в предыдущей практической работе.Можно использовать переменные в спецификации Terraform и передавать в них разные значения при запуске команд. Например, если сделать переменную для идентификатора образа
image-id, тогда с помощью одного и того же файла спецификации вы сможете создавать ВМ с разным наполнением.Переменные Terraform хранятся в файлах с расширением.tfvars. Создайте файлmy-variables.tfvarsи укажите в нём идентификатор своего образа Packer (узнайте идентификатор с помощью командыyc compute image list):image-id = "<идентификатор_образа>"В файле спецификацииmy-config.tfобъявите эту переменную (ключевое словоvariable). Тогда в секции, где описываются настройки ВМ, вы сможете обратиться к переменной какvar.image-id:... variable "image-id" { type = string } resource "yandex_compute_instance" "vm-1" { ... boot_disk { initialize_params { image_id = var.image-id } } ... -
Скорректируйте описание для сети и подсети.Для сети достаточно указать имя:
resource "yandex_vpc_network" "network-1" { name = "from-terraform-network" }Для подсети укажите зону доступности и сеть, а также внутренние IP-адреса, уникальные в рамках сети. Используйте адреса из адресного пространства10.0.0.0/16.resource "yandex_vpc_subnet" "subnet-1" { name = "from-terraform-subnet" zone = "ru-central1-a" network_id = "${yandex_vpc_network.network-1.id}" v4_cidr_blocks = ["10.2.0.0/16"] }Проверьте синтаксис спецификации:variable "image-id" { type = string } resource "yandex_compute_instance" "vm-1" { name = "from-terraform-vm" platform_id = "standard-v1" zone = "ru-central1-a" resources { cores = 2 memory = 2 } boot_disk { initialize_params { image_id = var.image-id } } network_interface { subnet_id = yandex_vpc_subnet.subnet-1.id nat = true } metadata = { ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}" } } resource "yandex_vpc_network" "network-1" { name = "from-terraform-network" } resource "yandex_vpc_subnet" "subnet-1" { name = "from-terraform-subnet" zone = "ru-central1-a" network_id = "${yandex_vpc_network.network-1.id}" v4_cidr_blocks = ["10.2.0.0/16"] } output "internal_ip_address_vm_1" { value = yandex_compute_instance.vm-1.network_interface.0.ip_address } output "external_ip_address_vm_1" { value = yandex_compute_instance.vm-1.network_interface.0.nat_ip_address }
-
Теперь попробуйте применить спецификацию. Перейдите в папку с файлом спецификации и выполните инициализацию.
terraform initЕсли всё сделано верно, Terraform покажет сообщение:... Terraform has been successfully initialized! ... -
Проверьте спецификацию с помощью команды
terraform plan.Terraform использует все файлы.tfиз папки, в которой запущена команда. Поэтому название файла спецификацииmy-config.tfуказывать не нужно: его Terraform подхватит и так.Если файл с переменными называется стандартно (terraform.tfvars), его тоже можно не указывать при запуске команды. А если название файла нестандартное, то его нужно указывать:terraform plan -var-file=my-variables.tfvarsTerraform выведет план: объекты, которые будут созданы, и т. п.:... Terraform will perform the following actions: ...На самом деле необязательно помещать переменные в файл, их можно просто указывать при запуске команды. Поскольку у вас только одна переменная, это было бы несложно:terraform plan -var="image-id=<идентификатор_образа>" -
Создайте в облаке инфраструктуру по описанной вами спецификации. Выполните команду:
terraform apply -var-file=my-variables.tfvarsTerraform запросит подтверждение:... 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.Когда команда будет выполнена, вы увидите сообщение:Apply complete! Resources: ... added, 0 changed, 0 destroyed. Outputs: external_ip_address_vm_1 = "84.201.133.49" internal_ip_address_vm_1 = "10.2.0.24" -
В консоли управления убедитесь, что ВМ создана. Откройте в браузере страницу с указанным IP-адресом и проверьте, доступна ли ВМ.
-
Как мы говорили на предыдущем уроке, Terraform хранит описание инфраструктуры в стейт-файлах. Посмотрите, как выглядит стейт-файл сейчас:
terraform state listВы увидите список объектов:yandex_compute_instance.vm-1 yandex_vpc_network.network-1 yandex_vpc_subnet.subnet-1 - Теперь добавьте в файл спецификации блок, описывающий создание кластера БД PostgreSQL. Подсказки ищите в справочнике ресурсов. Не забудьте заменить в спецификации имя подсети.
Сохраните файл спецификации.
-
Теперь примените обновлённую спецификацию. В папке с файлом спецификации выполните команду
terraform plan:terraform plan -var-file=my-variables.tfvarsЕсли появляются сообщения об ошибках — исправьте ошибки и снова выполните команду. -
Обновите инфраструктуру в соответствии с дополненной спецификацией командой
terraform apply:terraform apply -var-file=my-variables.tfvarsПоскольку спецификация теперь включает создание БД, команда может выполняться довольно долго (около 10 минут) -
В консоли управления откройте раздел Managed Service for PostgreSQL и убедитесь, что кластер
postgres-1создан и имеет статусAlive. -
Проверьте, как изменился стейт-файл:
terraform state listВ списке появился новый объект:yandex_compute_instance.vm-1 yandex_mdb_postgresql_cluster.postgres-1 yandex_vpc_network.network-1 yandex_vpc_subnet.subnet-1 -
Удалите инфраструктуру:
terraform destroy -var-file=my-variables.tfvarsВ конце вы увидите сообщение о выполнении команды:... Destroy complete! Resources: 4 destroyed.В консоли управления убедитесь, что объекты удалены.
На этом ваше знакомство с Terraform в рамках этого курса завершается. Конечно, его возможности гораздо шире, чем нам удалось посмотреть за два урока. Несмотря на относительную молодость (первый релиз вышел в 2014 году), Terraform широко используется в практике DevOps. Дальше изучайте программу сами: как вы уже убедились, это вполне доступно благодаря документации Terraform и облачным ресурсам Yandex Cloud.