Terraform — один из эффективных инструментов для работы по модели IaC (инфраструктура как код). Это ПО с открытым исходным кодом позволяет существенно упростить процесс развертывания и управления инфраструктурой как в локальных средах, так и в облаке. В статье рассмотрим, как выполнить увеличение размера загрузочного диска виртуальной машины через 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
будет присвоено ресурсу автоматически после успешного создания.
Изменение размера диска Timeweb Cloud в Terraform делается просто. Вот пример для нашего только что созданного системного диска:
configuration {
configurator_id = data.twc_configurator.configurator.id
size = 204800
}
И размер диска составит уже 200 ГБ, а после перезагрузки увеличится и сама файловая система. Главное, не забудьте обновить конфигурацию Terraform при помощи инструкции terraform apply
, чтобы применить изменения в вашей инфраструктуре. Заметим, что изменять размер дисков можно только в большую сторону, также можно удалять существующие диски и добавлять новые.
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
}
Здесь добавлена строчка с данными об образе. За счет этого появилась возможность динамически изменять параметры диска. Причем без необходимости использовать параметры инициализации, которые предназначены для повторного создания диска, а не для его изменения.
EBS или Amazon Elastic Block Store — это сервис хранения данных в облаке Amazon Web Services (AWS). EBS предоставляет блочное хранилище, которое может быть использовано для виртуальных машин и хранения данных. Диски в EBS также масштабируются, а Terraform существенно упрощает эту задачу. С помощью Terraform вы сможете изменить размер диска в EBS всего в три этапа.
Код этой инструкции уже должен быть вам знаком по примерам выше, только меняем значения на те, которые используются в 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
После этого должно появиться сообщение об изменении размера тома.
Создаем инстанс и выводим его идентификатор следующим образом:
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}"
}
Для того, чтобы у нас была возможность использовать весь размер увеличенного диска, понадобится создать специальный скрипт с таким кодом:
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 (не только увеличивать, но и уменьшать) без необходимости создания нового тома, что не всегда удобно.
Cloud-Init — удобный инструмент для настройки ОС виртуальной машины при первом запуске. Он позволяет настраивать различные параметры ОС (например, права пользователей и SSH-ключи), устанавливать сетевые настройки, ставить пакеты. Cloud-Init может использоваться с различными облачными платформами и системами виртуализации, в том числе AWS, GCP и VMware.
Для изменения размера жесткого диска в Terraform с помощью Cloud-Init сначала создаем диск уже знакомым способом:
resource "имя_ресурса" "mydisk" {
name = "my_new_VM"
type = "ssd"
size = 100
}
Теперь в файле cloud-init
(это конфигурационный файл в формате .yaml
) добавляем инструкцию для изменения размера диска, которая похожа на аналогичную инструкцию в Linux:
runcmd:
- echo "g" | fdisk /dev/sdb
- echo "w" | fdisk /dev/sdb
- partprobe
- resize2fs /dev/sdb1
При помощи этой инструкции мы создаем новую таблицу разделов диска и сохраняем ее, одновременно делая ее видимой для ОС.
Теперь добавляем этот измененный файл cloud-init
в конфигурацию Terraform в последние строки файла с расширением .tf
:
metadata = {
user-data = file("cloud-init.yaml")
}
И запускаем команду terraform apply
/ terraform refresh
для внесения изменений. Terraform автоматически применит файл cloud-init
после создания ресурса диска, что приведет к изменению размера диска.
Обратите внимание, что поддержка Cloud-Init может различаться в зависимости от облачного провайдера и установленной на виртуальной машине операционной системы, поэтому адаптируйте этот пример под свою конфигурацию.
Подведем итоги. Мы научились создавать диски в Terraform и увеличивать их размер при помощи того же Terraform, а также конфигурационных файлов и скриптов в разных окружениях.