terraform { required_providers { vsphere = { source = "hashicorp/vsphere" version = "~> 2.4" } } } # --- Креды vCenter --- variable "vsphere_user" {} variable "vsphere_password" {} variable "vsphere_server" {} # --- Фиктивные переменные Ansible --- variable "ansible_user" { default = "" } variable "ansible_password" { default = "" sensitive = true } # --- Переменные Survey --- variable "vm_name" {} variable "vm_ip" {} variable "vm_gateway" {} variable "vm_cpu" {} variable "vm_ram" {} variable "vm_disk_size" {} variable "vsphere_datacenter" {} variable "vsphere_datastore" {} variable "vsphere_pool" {} variable "vsphere_network" {} variable "vsphere_template" { default = "debian13-template" } # --- Настройка провайдера --- provider "vsphere" { user = var.vsphere_user password = var.vsphere_password vsphere_server = var.vsphere_server allow_unverified_ssl = true } # --- Поиск ресурсов в vCenter --- data "vsphere_datacenter" "dc" { name = var.vsphere_datacenter } data "vsphere_datastore" "datastore" { name = var.vsphere_datastore datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_resource_pool" "pool" { name = var.vsphere_pool datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_network" "network" { name = var.vsphere_network datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_virtual_machine" "template" { name = var.vsphere_template datacenter_id = data.vsphere_datacenter.dc.id } # --- Создание ВМ --- resource "vsphere_virtual_machine" "npm_vm" { name = var.vm_name resource_pool_id = data.vsphere_resource_pool.pool.id datastore_id = data.vsphere_datastore.datastore.id num_cpus = var.vm_cpu memory = var.vm_ram guest_id = data.vsphere_virtual_machine.template.guest_id network_interface { network_id = data.vsphere_network.network.id adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0] } disk { label = "disk0" size = var.vm_disk_size thin_provisioned = true } # --- Защита от удаления --- lifecycle { prevent_destroy = true } clone { template_uuid = data.vsphere_virtual_machine.template.id customize { linux_options { host_name = var.vm_name domain = "local" } network_interface { ipv4_address = var.vm_ip ipv4_netmask = 23 } ipv4_gateway = var.vm_gateway dns_server_list = ["192.168.1.1", "1.1.1.1"] } } provisioner "remote-exec" { connection { type = "ssh" user = var.ansible_user password = var.ansible_password host = var.vm_ip timeout = "5m" } inline = [ # Ждем, пока освободится блокировка dpkg (полезно при старте свежей ОС) "while sudo lsof /var/lib/dpkg/lock-frontend ; do sleep 10; done;", # Свободно используем sudo без всяких паролей! "sudo apt-get update -y", "sudo apt-get upgrade -y", "sudo apt-get install -y curl htop wget git", "echo 'VM УСПЕШНО ПОДГОТОВЛЕНА И ОБНОВЛЕНА!'" ] } }