Те, кто еще не знаком с IaaC или Infrastructure-as-a-Code, но постоянно работают с системами виртуализации, наверняка задумывались и не раз как ускорить процесс создания, первичной настройки и удаления тех или иных ресурсов. С помощью Terraform можно серьезно сэкономить время на рутинных операциях, а также заметно автоматизировать процесс работы, даже в случаях если Вы не связаны с разработкой ПО. Создание шаблонов виртуальных машин — полезная техника, которая используется системными администраторами давно годами. Добавив к этим шаблонам возможность управлять виртуальной инфраструктурой с помощью кода terraform, Вы получите недостающий «пятый элемент» в пазле менеджмента систем виртуализации.
Реальный пример
Давайте рассмотрим небольшой пример, где мы опишем в конфигурационных файлах и создадим две виртуальные машины в дата центре VMware vCenter. Буду предполагать, что terraform уже установлен у Вас на управляющем компьютере и мы сосредоточимся именно на написании необходимой конфигурации. В первую очередь создадим рабочую директорию, где у нас будут собраны все необходимые файлы. Именно из этой дирректории мы будем запускать различные команды terraform для их выполнения.
Певый файл, в данной директории будет main.tf, в котором будут описаны свойства подключения к vSphere, а также ресурсы vSphere, которые необходимы для наших виртуалных машин. Реальный пример такого файла представлен ниже.
provider "vsphere" {
user = "${var.vsphere_user}"
password = "${var.vsphere_password}"
vsphere_server = "${var.vsphere_server}"
allow_unverified_ssl = true
}
data "vsphere_datacenter" "dc" {
name = "MyDC"
}
data "vsphere_datastore" "datastore" {
name = "Datastore1"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}
data "vsphere_compute_cluster" "cluster" {
name = "MainCluster"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}
data "vsphere_network" "network" {
name = "public"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}
data "vsphere_virtual_machine" "template" {
name = "BaseTemplate-v.2.0"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
В файле main.tf в самом начале мы описали переменные, которые используются для подключения к система vSphere. Далее идет декларирование реальных ресурсов, которые задействованы в системе vSpehre. В данном примере это название виртуального дата центра VMware, название датастора, на котором будут храниться данные наших виртуалок, а также имена кластера, виртуальной сети и шаблона ВМ, который будет задействован при создании новых машин.
Теперь нам нужно создать отдельный файл variables.tf, в котором мы задекларируем переменные, используемые в нашем примере. Эти переменные — vsphere_user, vsphere_password, vsphere_server. Содержимое данного файла представлено ниже.
variable "vsphere_user" {}
variable "vsphere_password" {}
variable "vsphere_server" {}
Также создадим отдельный файл, который должен называться terraform.tfvars. В нем мы определяем уже конкретные значения переменных, которые были ранее задекларированы в файле variables.tf.
vsphere_user= "administrator@vsphere.local"
vsphere_password= "Some@Password1234"
vsphere_server= "192.168.1.100"
Теперь подготовим файл vm.tf, в котором опишем две виртуальные машины, которые будут запущены в процессе работы terraform. При описании свойств виртуальных машин, мы будем использовать переменные инфраструктуры, которые до этого определили. Также в terraform есть возможность задать такие настройки виртуальной машины, как ip адрес, хостнейм и DNS. Ниже представлен полный файл с конфигурацией этих виртуальных машин.
resource "vsphere_virtual_machine" "vm1" {
name = "testvm01"
resource_pool_id = "${data.vsphere_compute_cluster.cluster.resource_pool_id}"
datastore_id = "${data.vsphere_datastore.datastore.id}"
folder = "/MyDC/vm/TestVM"
num_cpus = 2
memory = 4096
guest_id = "${data.vsphere_virtual_machine.template.guest_id}"
scsi_type = "${data.vsphere_virtual_machine.template.scsi_type}"
network_interface {
network_id = "${data.vsphere_network.network.id}"
adapter_type = "${data.vsphere_virtual_machine.template.network_interface_types[0]}"
}
disk {
label = "disk0"
size = "${data.vsphere_virtual_machine.template.disks.0.size}"
eagerly_scrub = "${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}"
thin_provisioned = "${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}"
}
clone {
template_uuid = "${data.vsphere_virtual_machine.template.id}"
customize {
linux_options {
host_name = "testvm01"
domain = "company.com"
}
dns_server_list = ["10.0.0.53", "10.0.53.53"]
network_interface {
ipv4_address = "10.0.0.101"
ipv4_netmask = 24
}
ipv4_gateway = "10.0.0.1"
}
}
}
resource "vsphere_virtual_machine" "vm2" {
name = "testvm02"
resource_pool_id = "${data.vsphere_compute_cluster.cluster.resource_pool_id}"
datastore_id = "${data.vsphere_datastore.datastore.id}"
folder = "/MyDC/vm/TestVM"
num_cpus = 2
memory = 4096
guest_id = "${data.vsphere_virtual_machine.template.guest_id}"
scsi_type = "${data.vsphere_virtual_machine.template.scsi_type}"
network_interface {
network_id = "${data.vsphere_network.network.id}"
adapter_type = "${data.vsphere_virtual_machine.template.network_interface_types[0]}"
}
disk {
label = "disk0"
size = "${data.vsphere_virtual_machine.template.disks.0.size}"
eagerly_scrub = "${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}"
thin_provisioned = "${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}"
}
clone {
template_uuid = "${data.vsphere_virtual_machine.template.id}"
customize {
linux_options {
host_name = "testvm02"
domain = "company.com"
}
dns_server_list = ["10.0.0.53", "10.0.53.53"]
network_interface {
ipv4_address = "10.0.0.102"
ipv4_netmask = 24
}
ipv4_gateway = "10.0.0.1"
}
}
}
Когда все необходимые файлы созданы, пришло время для запуска terraform. Мы будем использовать 3 команды.
# terraform init
# terraform plan
# terraform apply
Так с помощью команды terraform init произойдет инициализация terraform и загрузка провайдера vsphere для связи с системой VMware. Команда terraform plan проанализирует текущее состояние системы и то, каков будет результат и изменения в случае полноценного выполнения заданных инструкций. Ну а уже с помощью terraform apply мы передадим инструкции в vCenter, и произойдет создание запланированных нами виртуальных машин.
Свежие комментарии