commit 355c2569493ec030bbeb3fd8428d1b2eec1642fc Author: admin Date: Tue Mar 10 02:22:38 2026 +0300 интеграция OpenTofu с Proxmox diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl new file mode 100644 index 0000000..ac7cea9 --- /dev/null +++ b/.terraform.lock.hcl @@ -0,0 +1,34 @@ +# This file is maintained automatically by "tofu init". +# Manual edits may be lost in future updates. + +provider "registry.opentofu.org/bpg/proxmox" { + version = "0.98.1" + constraints = "0.98.1" + hashes = [ + "h1:/3n9NevrIwRAI/0HOEbeO4uQfCCivjspG8pDgzhqOSU=", + ] +} + +provider "registry.opentofu.org/hashicorp/local" { + version = "2.7.0" + constraints = "2.7.0" + hashes = [ + "h1:uWL9nhlxLY2xW3GMh8IFQv0S1UP3HMlN/B+2Nr7fsZE=", + ] +} + +provider "registry.opentofu.org/hashicorp/random" { + version = "3.8.1" + constraints = "3.8.1" + hashes = [ + "h1:xX86qU/7e6ep0QoIQPgh4Ho+dKJrgYIJIzzqvVSgYuc=", + ] +} + +provider "registry.opentofu.org/hashicorp/tls" { + version = "4.2.1" + constraints = "4.2.1" + hashes = [ + "h1:jNN7/BmtBs6ipjreb8Y+Bc6no/H4GYL0zJ3jEbMDuyI=", + ] +} diff --git a/.terraform/providers/registry.opentofu.org/bpg/proxmox/0.98.1/linux_amd64 b/.terraform/providers/registry.opentofu.org/bpg/proxmox/0.98.1/linux_amd64 new file mode 120000 index 0000000..e31b2bd --- /dev/null +++ b/.terraform/providers/registry.opentofu.org/bpg/proxmox/0.98.1/linux_amd64 @@ -0,0 +1 @@ +/home/andy/.terraform.d/plugins/registry.opentofu.org/bpg/proxmox/0.98.1/linux_amd64 \ No newline at end of file diff --git a/.terraform/providers/registry.opentofu.org/bpg/proxmox/0.98.1/linux_amd64.lock b/.terraform/providers/registry.opentofu.org/bpg/proxmox/0.98.1/linux_amd64.lock new file mode 100644 index 0000000..e69de29 diff --git a/.terraform/providers/registry.opentofu.org/hashicorp/local/2.7.0/linux_amd64 b/.terraform/providers/registry.opentofu.org/hashicorp/local/2.7.0/linux_amd64 new file mode 120000 index 0000000..9a09af6 --- /dev/null +++ b/.terraform/providers/registry.opentofu.org/hashicorp/local/2.7.0/linux_amd64 @@ -0,0 +1 @@ +/home/andy/.terraform.d/plugins/registry.opentofu.org/hashicorp/local/2.7.0/linux_amd64 \ No newline at end of file diff --git a/.terraform/providers/registry.opentofu.org/hashicorp/local/2.7.0/linux_amd64.lock b/.terraform/providers/registry.opentofu.org/hashicorp/local/2.7.0/linux_amd64.lock new file mode 100644 index 0000000..e69de29 diff --git a/.terraform/providers/registry.opentofu.org/hashicorp/random/3.8.1/linux_amd64 b/.terraform/providers/registry.opentofu.org/hashicorp/random/3.8.1/linux_amd64 new file mode 120000 index 0000000..3bee18d --- /dev/null +++ b/.terraform/providers/registry.opentofu.org/hashicorp/random/3.8.1/linux_amd64 @@ -0,0 +1 @@ +/home/andy/.terraform.d/plugins/registry.opentofu.org/hashicorp/random/3.8.1/linux_amd64 \ No newline at end of file diff --git a/.terraform/providers/registry.opentofu.org/hashicorp/random/3.8.1/linux_amd64.lock b/.terraform/providers/registry.opentofu.org/hashicorp/random/3.8.1/linux_amd64.lock new file mode 100644 index 0000000..e69de29 diff --git a/.terraform/providers/registry.opentofu.org/hashicorp/tls/4.2.1/linux_amd64 b/.terraform/providers/registry.opentofu.org/hashicorp/tls/4.2.1/linux_amd64 new file mode 120000 index 0000000..edde7b3 --- /dev/null +++ b/.terraform/providers/registry.opentofu.org/hashicorp/tls/4.2.1/linux_amd64 @@ -0,0 +1 @@ +/home/andy/.terraform.d/plugins/registry.opentofu.org/hashicorp/tls/4.2.1/linux_amd64 \ No newline at end of file diff --git a/.terraform/providers/registry.opentofu.org/hashicorp/tls/4.2.1/linux_amd64.lock b/.terraform/providers/registry.opentofu.org/hashicorp/tls/4.2.1/linux_amd64.lock new file mode 100644 index 0000000..e69de29 diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..c5bf9c3 --- /dev/null +++ b/main.tf @@ -0,0 +1,75 @@ +terraform { + required_providers { + proxmox = { + source = "bpg/proxmox" + version = "0.98.1" + } + local = { + source = "hashicorp/local" + version = "2.7.0" + } + random = { + source = "hashicorp/random" + version = "3.8.1" + } + tls = { + source = "hashicorp/tls" + version = "4.2.1" + } + } +} + +provider "proxmox" { + endpoint = var.proxmox_endpoint + api_token = "${var.proxmox_token_id}=${var.proxmox_token_secret}" + insecure = true +} + +provider "local" {} +provider "random" {} +provider "tls" {} + + + +data "proxmox_virtual_environment_version" "current" {} +output "proxmox_version" { + value = data.proxmox_virtual_environment_version.current.version +} + +resource "proxmox_virtual_environment_vm" "node1" { + vm_id = var.vm_id + name = var.vm_name + node_name = "px" # имя ноды Proxmox + on_boot = true + + clone { + vm_id = var.template_id + full = true + } + + # Cloud Init ✦ пользователь, ssh-ключ, сеть + initialization { + datastore_id = var.datastore_vm + user_account { + username = var.cloudinit_user + keys = [ var.ssh_public_key ] + } + + ip_config { + ipv4 { + address = "dhcp" + } + } + } + + network_device { + bridge = "vmbr1" + } + + agent { + enabled = true + } +} +output "vm_ipv4" { + value = proxmox_virtual_environment_vm.node1.ipv4_addresses +} diff --git a/terraform.tfstate b/terraform.tfstate new file mode 100644 index 0000000..c494b4a --- /dev/null +++ b/terraform.tfstate @@ -0,0 +1 @@ +{"version":4,"terraform_version":"1.11.5","serial":12,"lineage":"ddaa48b0-8fa2-d48c-f9c8-a548d9a46a26","outputs":{"proxmox_version":{"value":"9.1.1","type":"string"},"vm_ipv4":{"value":[["127.0.0.1"],["10.10.10.100"]],"type":["list",["list","string"]]}},"resources":[{"mode":"data","type":"proxmox_virtual_environment_version","name":"current","provider":"provider[\"registry.opentofu.org/bpg/proxmox\"]","instances":[{"schema_version":0,"attributes":{"id":"version","release":"9.1","repository_id":"42db4a6cf33dac83","version":"9.1.1"},"sensitive_attributes":[]}]},{"mode":"managed","type":"proxmox_virtual_environment_vm","name":"node1","provider":"provider[\"registry.opentofu.org/bpg/proxmox\"]","instances":[{"schema_version":0,"attributes":{"acpi":true,"agent":[{"enabled":true,"timeout":"15m","trim":false,"type":"virtio","wait_for_ip":[]}],"amd_sev":[],"audio_device":[],"bios":"seabios","boot_order":[],"cdrom":[],"clone":[{"datastore_id":"","full":true,"node_name":"","retries":1,"vm_id":9002}],"cpu":[],"delete_unreferenced_disks_on_destroy":true,"description":null,"disk":[],"efi_disk":[],"hook_script_file_id":null,"hostpci":[],"hotplug":null,"id":"9100","initialization":[{"datastore_id":"local","dns":[],"file_format":"qcow2","interface":"ide2","ip_config":[{"ipv4":[{"address":"dhcp","gateway":""}],"ipv6":[]}],"meta_data_file_id":"","network_data_file_id":"","type":"","user_account":[{"keys":["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPiX5bOEXfX3AvwstdAyYYHgSyGDF12NzOBCwfNPQVgo terraform@lxc"],"password":"","username":"ubuntu"}],"user_data_file_id":"","vendor_data_file_id":""}],"ipv4_addresses":[["127.0.0.1"],["10.10.10.100"]],"ipv6_addresses":[["::1"],["fe80::be24:11ff:fe54:52f6"]],"keyboard_layout":"en-us","kvm_arguments":null,"mac_addresses":["00:00:00:00:00:00","BC:24:11:54:52:F6"],"machine":null,"memory":[],"migrate":false,"name":"ubuntu-node1","network_device":[{"bridge":"vmbr1","disconnected":false,"enabled":true,"firewall":false,"mac_address":"BC:24:11:54:52:F6","model":"virtio","mtu":0,"queues":0,"rate_limit":0,"trunks":"","vlan_id":0}],"network_interface_names":["lo","eth0"],"node_name":"px","numa":[],"on_boot":true,"operating_system":[],"pool_id":"","protection":false,"purge_on_destroy":true,"reboot":false,"reboot_after_update":true,"rng":[],"scsi_hardware":"virtio-scsi-pci","serial_device":[],"smbios":[],"started":true,"startup":[],"stop_on_destroy":false,"tablet_device":true,"tags":null,"template":false,"timeout_clone":1800,"timeout_create":1800,"timeout_migrate":1800,"timeout_move_disk":1800,"timeout_reboot":1800,"timeout_shutdown_vm":1800,"timeout_start_vm":1800,"timeout_stop_vm":300,"tpm_state":[],"usb":[],"vga":[],"virtiofs":[],"vm_id":9100,"watchdog":[]},"sensitive_attributes":[[{"type":"get_attr","value":"initialization"},{"type":"index","value":{"value":0,"type":"number"}},{"type":"get_attr","value":"user_account"},{"type":"index","value":{"value":0,"type":"number"}},{"type":"get_attr","value":"password"}]],"private":"bnVsbA=="}]}],"check_results":null} diff --git a/terraform.tfstate.backup b/terraform.tfstate.backup new file mode 100644 index 0000000..a396b0a --- /dev/null +++ b/terraform.tfstate.backup @@ -0,0 +1 @@ +{"version":4,"terraform_version":"1.11.5","serial":11,"lineage":"ddaa48b0-8fa2-d48c-f9c8-a548d9a46a26","outputs":{"proxmox_version":{"value":"9.1.1","type":"string"},"vm_ipv4":{"value":[],"type":["list",["list","string"]]}},"resources":[{"mode":"data","type":"proxmox_virtual_environment_version","name":"current","provider":"provider[\"registry.opentofu.org/bpg/proxmox\"]","instances":[{"schema_version":0,"attributes":{"id":"version","release":"9.1","repository_id":"42db4a6cf33dac83","version":"9.1.1"},"sensitive_attributes":[]}]},{"mode":"managed","type":"proxmox_virtual_environment_vm","name":"node1","provider":"provider[\"registry.opentofu.org/bpg/proxmox\"]","instances":[{"schema_version":0,"attributes":{"acpi":true,"agent":[{"enabled":true,"timeout":"15m","trim":false,"type":"virtio","wait_for_ip":[]}],"amd_sev":[],"audio_device":[],"bios":"seabios","boot_order":[],"cdrom":[],"clone":[{"datastore_id":"","full":true,"node_name":"","retries":1,"vm_id":9002}],"cpu":[],"delete_unreferenced_disks_on_destroy":true,"description":null,"disk":[],"efi_disk":[],"hook_script_file_id":null,"hostpci":[],"hotplug":null,"id":"9100","initialization":[{"datastore_id":"local","dns":[],"file_format":"qcow2","interface":"ide2","ip_config":[{"ipv4":[{"address":"dhcp","gateway":""}],"ipv6":[]}],"meta_data_file_id":"","network_data_file_id":"","type":"","user_account":[{"keys":["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPiX5bOEXfX3AvwstdAyYYHgSyGDF12NzOBCwfNPQVgo terraform@lxc"],"password":"","username":"ubuntu"}],"user_data_file_id":"","vendor_data_file_id":""}],"ipv4_addresses":[],"ipv6_addresses":[],"keyboard_layout":"en-us","kvm_arguments":null,"mac_addresses":[],"machine":null,"memory":[],"migrate":false,"name":"ubuntu-node1","network_device":[{"bridge":"vmbr1","disconnected":false,"enabled":true,"firewall":false,"mac_address":"BC:24:11:A4:09:99","model":"virtio","mtu":0,"queues":0,"rate_limit":0,"trunks":"","vlan_id":0}],"network_interface_names":[],"node_name":"px","numa":[],"on_boot":true,"operating_system":[],"pool_id":"","protection":false,"purge_on_destroy":true,"reboot":false,"reboot_after_update":true,"rng":[],"scsi_hardware":"virtio-scsi-pci","serial_device":[],"smbios":[],"started":true,"startup":[],"stop_on_destroy":false,"tablet_device":true,"tags":null,"template":false,"timeout_clone":1800,"timeout_create":1800,"timeout_migrate":1800,"timeout_move_disk":1800,"timeout_reboot":1800,"timeout_shutdown_vm":1800,"timeout_start_vm":1800,"timeout_stop_vm":300,"tpm_state":[],"usb":[],"vga":[],"virtiofs":[],"vm_id":9100,"watchdog":[]},"sensitive_attributes":[[{"type":"get_attr","value":"initialization"},{"type":"index","value":{"value":0,"type":"number"}},{"type":"get_attr","value":"user_account"},{"type":"index","value":{"value":0,"type":"number"}},{"type":"get_attr","value":"password"}]],"private":"bnVsbA=="}]}],"check_results":null} diff --git a/terraform.tfvars b/terraform.tfvars new file mode 100644 index 0000000..362cd2a --- /dev/null +++ b/terraform.tfvars @@ -0,0 +1,9 @@ +proxmox_endpoint = "https://185.78.29.7:8006/api2/json" +proxmox_token_id = "terraform@pve!tf" +proxmox_token_secret = "API_TOKEN" +template_id = 9002 +vm_id = 9100 +vm_name = "ubuntu-node1" +cloudinit_user = "ubuntu" +ssh_public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPiX5bOEXfX3AvwstdAyYYHgSyGDF12NzOBCwfNPQVgo terraform@lxc" +datastore_vm = "local" diff --git a/variables.tf b/variables.tf new file mode 100644 index 0000000..d872011 --- /dev/null +++ b/variables.tf @@ -0,0 +1,36 @@ +variable "proxmox_endpoint" { + type = string +} + +variable "proxmox_token_id" { + type = string +} + +variable "proxmox_token_secret" { + type = string + sensitive = true +} + +variable "template_id" { + type = number +} + +variable "vm_id" { + type = number +} + +variable "vm_name" { + type = string +} + +variable "cloudinit_user" { + type = string +} + +variable "ssh_public_key" { + type = string +} + +variable "datastore_vm" { + type = string +}