0

terraform

VMware и terraform

28.05.2023

Те, кто еще не знаком с 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, и произойдет создание запланированных нами виртуальных машин.

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380