VMware и terraform

12/04/2020

terraform

Если публичные облака в нашей стране используют далеко не все организации в своей работе, то кластеры под управлением VMware работают практически в каждой более или менее серьезной организации. И точно так же, как и при использовании публичных облаков, в крупных развертываниях в локальном виртуальном окружении подход IaaC крайне продуктивен и полезен. Утилита от hashicorp terraform так же эффективно работает с виртуальной инфраструктурой, как и с облачной. Писал в своем блоге уже статью о Terraform — Автоматизируем облако с Terraform. Там мы рассмотрели, как автоматизировать создание нужной инфраструктуры публичных сервисов AWS с помощью Terraform. Теперь хотелось бы показать, что можно делать аналогичные действия с виртуальными машинами в кластере VMware vCenter.

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

Заключение

В данной статье приводится пример реального использования terraform для управления виртуализированной инфраструктурой. Лично для меня такой подход стал уже нормой и необходимостью в повседневной работе. Он позволяет прилично экономить время на рутинных операциях. И что самое главное, инструмент унифицированный и позволяет работать, как с различными системами виртуализации, так и с облачной инфраструктурой.

Добавить комментарий

Ваш адрес email не будет опубликован.