Thank you for reading this post, don't forget to subscribe!
рассмотрим небольшой пример, где мы опишем в конфигурационных файлах и создадим две виртуальные машины в дата центре VMware vCenter. Буду предполагать, что terraform уже установлен у Вас на управляющем компьютере и мы сосредоточимся именно на написании необходимой конфигурации. В первую очередь создадим рабочую директорию, где у нас будут собраны все необходимые файлы. Именно из этой дирректории мы будем запускать различные команды terraform для их выполнения.
Первый файл, в данной директории будет main.tf, в котором будут описаны свойства подключения к vSphere, а также ресурсы vSphere, которые необходимы для наших виртуальных машин. Реальный пример такого файла представлен ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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. Содержимое данного файла представлено ниже.
1 2 3 |
variable "vsphere_user" {} variable "vsphere_password" {} variable "vsphere_server" {} |
Также создадим отдельный файл, который должен называться terraform.tfvars. В нем мы определяем уже конкретные значения переменных, которые были ранее задекларированы в файле variables.tf.
1 2 3 |
vsphere_user= "administrator@vsphere.local" vsphere_password= "Some@Password1234" vsphere_server= "192.168.1.100" |
Теперь подготовим файл vm.tf, в котором опишем две виртуальные машины, которые будут запущены в процессе работы terraform. При описании свойств виртуальных машин, мы будем использовать переменные инфраструктуры, которые до этого определили. Также в terraform есть возможность задать такие настройки виртуальной машины, как ip адрес, хостнейм и DNS. Ниже представлен полный файл с конфигурацией этих виртуальных машин.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
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, и произойдет создание запланированных нами виртуальных машин.