Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Увеличение размера загрузочного диска через Terraform

Роман Андреев
Роман Андреев
Технический писатель
10 мая 2023 г.
336
7 минут чтения
Средний рейтинг статьи: 5

Terraform — один из эффективных инструментов для работы по модели IaC (инфраструктура как код). Это ПО с открытым исходным кодом позволяет существенно упростить процесс развертывания и управления инфраструктурой как в локальных средах, так и в облаке. В статье рассмотрим, как выполнить увеличение размера загрузочного диска виртуальной машины через Terraform различными способами и в разных окружениях.

Как создавать загрузочные диски через Terraform

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

Файл конфигурации имеет расширение .tf и находится в корневом каталоге. Так, если вы хотите создать виртуальную машину в облаке Timeweb Cloud и задать размер жесткого диска 100 ГБ, то в файле конфигурации .tf нужно создать ресурс twc_server (для дополнительного диска нужно создавать ресурс twc_server_disk) и указать этот параметр в блоке configuration. Рассмотрим на примере дополнительного диска:

resource "twc_server" "my-server" {
  name = "My Server Disk"
  os_id = data.twc_os.os.id

  configuration {
    configurator_id = data.twc_configurator.configurator.id
    size  = 102400
  }
}

В этом примере мы задали размер диска 100 Гб. Размер всегда задается в мегабайтах с шагом 5120 Мб (5 Гб). Разумеется, значения параметров нетрудно изменить в соответствии с требованиями вашего проекта.

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

resource "twc_server_disk" "my-server-disk" {
  disk {
    size = 102400
    source_server_id = twc_server.my-server.id
  }
}

Обратите внимание, что значение id будет присвоено ресурсу автоматически после успешного создания.

Как увеличить объем загрузочного диска виртуальной машины в Terraform

Изменение размера диска Timeweb Cloud в Terraform делается просто. Вот пример для нашего только что созданного системного диска:

configuration {
    configurator_id = data.twc_configurator.configurator.id
    size  = 204800
  }

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

Terraform и увеличение размера диска в GCP

Google Cloud Platform — облачная платформа, которая предлагает много инструментов и сервисов для разработки, развертывания и управления приложениями в облаке. Приведенные выше инструкции будут работать и для нее, только в первой строке resource замените наш пример twc_server на google_compute. Вот так:

resource "google_compute" "mydisk" {
  name = "my_new_VM"
  type  = "ssd"
  size  = 100
}

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

resource "google_compute" "mydisk" {
  name  = "my_new_VM"
  image = data.google_compute_image.my_image.self_link
}

Здесь добавлена строчка с данными об образе. За счет этого появилась возможность динамически изменять параметры диска. Причем без необходимости использовать параметры инициализации, которые предназначены для повторного создания диска, а не для его изменения.

Как увеличить размер диска в Terraform с помощью EBS: шаг за шагом

EBS или Amazon Elastic Block Store — это сервис хранения данных в облаке Amazon Web Services (AWS). EBS предоставляет блочное хранилище, которое может быть использовано для виртуальных машин и хранения данных. Диски в EBS также масштабируются, а Terraform существенно упрощает эту задачу. С помощью Terraform вы сможете изменить размер диска в EBS всего в три этапа.

Шаг 1. Создаем ресурс Terraform

Код этой инструкции уже должен быть вам знаком по примерам выше, только меняем значения на те, которые используются в EBS, и указываем кое-что дополнительно:

resource "aws_ebs_volume" "mydisk" {
  zone = "europe-north1-a"
  size = 200
  type = "ssd"
  tags {
    Name = "mydisk"
    Role = "db"
    Terraform = "true"
    FS = "xfs"
  }
}

Далее выполняем импорт (имя тома приведено просто для примера):

$ terraform import aws_ebs_volume.mydisk vol-13579ace02468bdf1

При успешном импорте система должна ответить соответствующим сообщением. Теперь вы уже можете изменить размер тома, заменив в коде выше, например, 200 на 500:

size = 500

и затем ввести следующее:

$ terraform apply -target=aws_ebs_volume.mydisk

После этого должно появиться сообщение об изменении размера тома.

Шаг 2. Определяем IP-адрес

Создаем инстанс и выводим его идентификатор следующим образом:

data "aws_instance" "mysql" {
  filter {
    name   = "block-device-mapping.volume-id"
    values = ["${aws_ebs_volume.mydisk.id}"]
  }
}

output "instance_id" {
  value = "${data.aws_instance.mydisk.id}"
}

Теперь обновляем конфигурацию при помощи инструкции terraform apply / terraform refresh, в результате чего мы должны получить следующий вывод:

instance_id = i-13579ace02468bdf1

Осталось получить Mount point, которая будет указывать на наш том внутри инстанса:

locals {
  mount_point = "${data.aws_instance.mydisk.ebs_block_device.0.device_name}"
}

Шаг 3. Запускаем скрипт

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

resource "null_resource" "expand_disk" {
  connection {
    type        = "ssh"
    user        = "username"
    private_key = "${file("ssh-key-here")}"
    host        = "${data.aws_instance.mydisk.xxx.xxx.xxx.xxx}"
}

  provisioner "remote-exec" {
    inline = [
      "sudo lsblk",
      "sudo xfs_growfs ${local.mount_point}",
    ]
  }
}

Небольшой комментарий: вместо xxx.xxx.xxx.xxx укажите публичный IP-адрес созданного диска. Вот и всё, осталось только запустить скрипт следующей инструкцией:

$ terraform apply -target=null_resource.expand_disk

Таким образом можно изменять размер диска через Terraform в EBS (не только увеличивать, но и уменьшать) без необходимости создания нового тома, что не всегда удобно.

Как изменить размер жесткого диска в Terraform с помощью Cloud-Init

Cloud-Init — удобный инструмент для настройки ОС виртуальной машины при первом запуске. Он позволяет настраивать различные параметры ОС (например, права пользователей и SSH-ключи), устанавливать сетевые настройки, ставить пакеты. Cloud-Init может использоваться с различными облачными платформами и системами виртуализации, в том числе AWS, GCP и VMware.

Шаг 1. Создаем диск

Для изменения размера жесткого диска в Terraform с помощью Cloud-Init сначала создаем диск уже знакомым способом:

resource "имя_ресурса" "mydisk" {
  name = "my_new_VM"
  type  = "ssd"
  size  = 100
}

Шаг 2. Изменяем файл cloud-init 

Теперь в файле cloud-init (это конфигурационный файл в формате .yaml) добавляем инструкцию для изменения размера диска, которая похожа на аналогичную инструкцию в Linux:

runcmd:
 - echo "g" | fdisk /dev/sdb
 - echo "w" | fdisk /dev/sdb
 - partprobe
 - resize2fs /dev/sdb1

При помощи этой инструкции мы создаем новую таблицу разделов диска и сохраняем ее, одновременно делая ее видимой для ОС.

Шаг 3. Изменяем конфигурационный файл Terraform

Теперь добавляем этот измененный файл cloud-init в конфигурацию Terraform в последние строки файла с расширением .tf:

metadata = {
  user-data = file("cloud-init.yaml")
}

И запускаем команду terraform apply / terraform refresh для внесения изменений. Terraform автоматически применит файл cloud-init после создания ресурса диска, что приведет к изменению размера диска.

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

Заключение

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

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону