doc: добавление документации по созданию вм через tf

This commit is contained in:
grodionov 2026-02-03 14:17:48 +03:00
parent db37cf8832
commit 11d1f1091b
19 changed files with 59 additions and 443 deletions

View File

@ -0,0 +1,26 @@
# This file is maintained automatically by "tofu init".
# Manual edits may be lost in future updates.
provider "registry.opentofu.org/hashicorp/local" {
version = "2.5.1"
constraints = "2.5.1"
hashes = [
"h1:GgW5qncKu4KnXLE1ZYv5iwmhSYtTNzsOvJAOQIyFR7E=",
]
}
provider "registry.opentofu.org/hashicorp/random" {
version = "3.5.1"
constraints = "3.5.1"
hashes = [
"h1:tW+G7lgqbHUtraKHPWuotYHlME1vcAf50YvOeHQlGHg=",
]
}
provider "registry.opentofu.org/vmware/vcd" {
version = "3.14.1"
constraints = "3.14.1"
hashes = [
"h1:BR77ewAJ1Z88VnU+68KPrD2hxNFEusBPRYcrG97G+gQ=",
]
}

View File

@ -0,0 +1 @@
/home/grodionov/.tofu.d/plugin-cache/registry.opentofu.org/hashicorp/local/2.5.1/linux_amd64

View File

@ -0,0 +1 @@
/home/grodionov/.tofu.d/plugin-cache/registry.opentofu.org/hashicorp/random/3.5.1/linux_amd64

View File

@ -0,0 +1 @@
/home/grodionov/.tofu.d/plugin-cache/registry.opentofu.org/vmware/vcd/3.14.1/linux_amd64

View File

@ -0,0 +1 @@
{"version":4,"terraform_version":"1.10.7","serial":31,"lineage":"31b324f3-6ba4-4920-3b1c-039429f92d92","outputs":{},"resources":[],"check_results":null}

View File

@ -0,0 +1 @@
{"version":4,"terraform_version":"1.10.7","serial":28,"lineage":"31b324f3-6ba4-4920-3b1c-039429f92d92","outputs":{},"resources":[{"mode":"managed","type":"random_password","name":"admin_pass","provider":"provider[\"registry.opentofu.org/hashicorp/random\"]","instances":[{"schema_version":3,"attributes":{"bcrypt_hash":"$2a$10$BdZVqaOScpzgidDxxxB8a.RpunbgGx2UuJLa2OmzZlZP5V/T6QFJa","id":"none","keepers":null,"length":20,"lower":true,"min_lower":0,"min_numeric":0,"min_special":0,"min_upper":0,"number":true,"numeric":true,"override_special":null,"result":"ZXR3ianjPuyOJRal7wvj","special":false,"upper":true},"sensitive_attributes":[[{"type":"get_attr","value":"result"}],[{"type":"get_attr","value":"bcrypt_hash"}]]}]},{"mode":"managed","type":"vcd_vapp","name":"vapp","instances":[{"index_key":"test","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"description":"","guest_properties":null,"href":"https://sandbox.nubes.ru/api/vApp/vapp-ea1d3265-2b6e-4921-bb6f-d488bf1a2460","id":"urn:vcloud:vapp:ea1d3265-2b6e-4921-bb6f-d488bf1a2460","inherited_metadata":{},"lease":[{"runtime_lease_in_sec":0,"storage_lease_in_sec":0}],"metadata":{},"metadata_entry":[],"name":"test","org":null,"power_on":false,"status":1,"status_text":"RESOLVED","vapp_network_names":[],"vapp_org_network_names":[],"vdc":null,"vm_names":[]},"sensitive_attributes":[],"private":"bnVsbA=="}]},{"mode":"managed","type":"vcd_vapp_org_network","name":"routed_network","instances":[{"index_key":"test","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"id":"urn:vcloud:network:ad5d19c4-c426-4506-b317-1292782bdec7","is_fenced":false,"org":null,"org_network_name":"dev-mgmt-network","reboot_vapp_on_removal":true,"retain_ip_mac_enabled":false,"vapp_name":"test","vdc":null},"sensitive_attributes":[],"private":"bnVsbA==","dependencies":["vcd_vapp.vapp"]}]},{"mode":"managed","type":"vcd_vapp_vm","name":"vm","instances":[{"index_key":"test01.testservers","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"accept_all_eulas":true,"boot_image":null,"boot_image_id":null,"boot_options":[{"boot_delay":0,"boot_retry_delay":10000,"boot_retry_enabled":false,"efi_secure_boot":false,"enter_bios_setup_on_next_boot":false}],"catalog_name":"dev","computer_name":"test01.testservers","consolidate_disks_on_create":false,"copy_from_vm_id":null,"cpu_cores":1,"cpu_hot_add_enabled":false,"cpu_limit":null,"cpu_priority":"","cpu_reservation":null,"cpu_shares":null,"cpus":1,"customization":[{"admin_password":"ZXR3ianjPuyOJRal7wvj","allow_local_admin_password":true,"auto_generate_password":false,"change_sid":false,"enabled":true,"force":false,"initscript":"","join_domain":false,"join_domain_account_ou":"","join_domain_name":"","join_domain_password":"","join_domain_user":"","join_org_domain":false,"must_change_password_on_first_login":false,"number_of_auto_logons":0}],"description":"Template Ubuntu_24-20G","disk":[],"expose_hardware_virtualization":false,"extra_config":[{"key":"vmotion.checkpointSVGAPrimarySize","required":false,"value":"4194304"},{"key":"pciBridge0.present","required":true,"value":"TRUE"},{"key":"vmware.tools.internalversion","required":false,"value":"12421"},{"key":"vmware.tools.requiredversion","required":false,"value":"12448"},{"key":"disk.EnableUUID","required":true,"value":"TRUE"},{"key":"sched.swap.derivedName","required":false,"value":"/vmfs/volumes/66f13602-e2679498-497a-48df3709874c/test01.testservers-qOAS/test01.testservers-qOAS-8b5caf0d.vswp"},{"key":"pciBridge1.virtualDev","required":false,"value":"pciRootBridge"},{"key":"cloud.uuid","required":false,"value":"40da131c-c679-4b9c-8347-46dd41aa43ab"},{"key":"nvram","required":false,"value":"test01.testservers-qOAS.nvram"},{"key":"vmotion.svga.mobMaxSize","required":false,"value":"4194304"},{"key":"tools.guest.desktop.autolock","required":true,"value":"TRUE"},{"key":"pciBridge0.functions","required":true,"value":"1"},{"key":"pciBridge1:0.pxm","required":false,"value":"0"},{"key":"scsi0.sasWWID","required":false,"value":"50 05 05 67 7f c2 81 f0"},{"key":"cpuid.coresPerSocket.cookie","required":true,"value":"1"},{"key":"migrate.migrationId","required":false,"value":"0"},{"key":"hpet0.present","required":true,"value":"TRUE"},{"key":"migrate.hostLog","required":false,"value":"test01.testservers-qOAS-74c531ab.hlog"},{"key":"tools.deploypkg.filename","required":false,"value":"cust6465156125709420514.cab"},{"key":"numa.autosize.cookie","required":false,"value":"10012"},{"key":"vmotion.svga.graphicsMemoryKB","required":false,"value":"4096"},{"key":"monitor.phys_bits_used","required":false,"value":"45"},{"key":"svga.present","required":true,"value":"TRUE"},{"key":"vmxstats.filename","required":false,"value":"test01.testservers-qOAS.scoreboard"},{"key":"ethernet0.pciSlotNumber","required":false,"value":"33"},{"key":"scsi0.pciSlotNumber","required":false,"value":"32"},{"key":"pciBridge0.pxm","required":false,"value":"-1"},{"key":"pciBridge0.virtualDev","required":false,"value":"pciRootBridge"},{"key":"pciBridge1.functions","required":true,"value":"1"},{"key":"migrate.hostLogState","required":false,"value":"none"},{"key":"softPowerOff","required":false,"value":"FALSE"},{"key":"viv.moid","required":false,"value":"8b3e0bd6-5231-468f-aad7-fd0d31752da0:vm-14802:Z5v2PSS+Os7E/F2DOfV4bViCSxoQXWmvFE9q1LLp/2s="},{"key":"scsi0:0.redo","required":false,"value":""},{"key":"guestinfo.ovfEnv","required":false,"value":""},{"key":"numa.autosize.vcpu.maxPerVirtualNode","required":true,"value":"1"},{"key":"pciBridge1.present","required":true,"value":"TRUE"},{"key":"sched.cpu.latencySensitivity","required":false,"value":"normal"},{"key":"vmotion.checkpointFBSize","required":false,"value":"4194304"}],"firmware":"efi","guest_properties":{"user-data":"I2Nsb3VkLWNvbmZpZwpob3N0bmFtZTogdGVzdDAxLnRlc3RzZXJ2ZXJzCnBhY2thZ2VfdXBkYXRlOiB0cnVlCnBhY2thZ2VfdXBncmFkZTogZmFsc2UKcGFja2FnZXM6CiAgLSBjdXJsCiAgLSBnaXQKICAtIGpxCgp1c2VyczoKICAtIG5hbWU6IGRlcGxveQogICAgc3VkbzogICAiQUxMPShBTEwpIE5PUEFTU1dEOkFMTCIKICAgIGdyb3VwczogInN1ZG8iCiAgICBzaGVsbDogL2Jpbi9iYXNoCiAgICBzc2hfYXV0aG9yaXplZF9rZXlzOgogICAgICAtIHNzaC1lZDI1NTE5ICoqKioqKioqKgo="},"hardware_version":"vmx-21","href":"https://sandbox.nubes.ru/api/vApp/vm-abd228e7-e3db-4dbf-860c-b40cd6fe8262","id":"urn:vcloud:vm:abd228e7-e3db-4dbf-860c-b40cd6fe8262","imported":false,"inherited_metadata":{"vm.origin.id":"db7d48b8-b376-4bb0-8b70-b86aa5ed4d11","vm.origin.name":"Ubuntu_24-20G","vm.origin.type":"com.vmware.vcloud.entity.vm"},"internal_disk":[{"bus_number":0,"bus_type":"paravirtual","disk_id":"2000","iops":0,"size_in_mb":35000,"storage_profile":"SSD","thin_provisioned":true,"unit_number":0}],"memory":1024,"memory_hot_add_enabled":false,"memory_limit":null,"memory_priority":"","memory_reservation":null,"memory_shares":null,"metadata":{},"metadata_entry":[],"name":"test01.testservers","network":[{"adapter_type":"VMXNET3","connected":true,"ip":"10.80.0.2","ip_allocation_mode":"POOL","is_primary":true,"mac":"00:50:56:04:11:31","name":"dev-mgmt-network","secondary_ip":"","secondary_ip_allocation_mode":"NONE","type":"org"}],"network_dhcp_wait_seconds":null,"org":null,"os_type":"ubuntu64Guest","override_template_disk":[{"bus_number":0,"bus_type":"paravirtual","iops":null,"size_in_mb":35000,"storage_profile":"","unit_number":0}],"placement_policy_id":"","power_on":true,"prevent_update_power_off":false,"security_tags":[],"set_extra_config":[{"key":"disk.EnableUUID","value":"TRUE"}],"sizing_policy_id":"urn:vcloud:vdcComputePolicy:6a68b02d-4b42-4830-83ff-afbde2f16b0c","status":4,"status_text":"POWERED_ON","storage_profile":"SSD","template_name":"Ubuntu_24-20G","vapp_id":"urn:vcloud:vapp:ea1d3265-2b6e-4921-bb6f-d488bf1a2460","vapp_name":"test","vapp_template_id":null,"vdc":null,"vm_name_in_template":null,"vm_type":"vcd_vapp_vm"},"sensitive_attributes":[[{"type":"get_attr","value":"customization"},{"type":"index","value":{"value":0,"type":"number"}},{"type":"get_attr","value":"join_domain_password"}],[{"type":"get_attr","value":"customization"},{"type":"index","value":{"value":0,"type":"number"}},{"type":"get_attr","value":"admin_password"}]],"private":"bnVsbA==","dependencies":["random_password.admin_pass","vcd_vapp.vapp","vcd_vapp_org_network.routed_network"]}]},{"mode":"managed","type":"vcd_vm_internal_disk","name":"vmdisk","instances":[{"index_key":"test01.testservers-1","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"allow_vm_reboot":true,"bus_number":0,"bus_type":"paravirtual","id":"2001","iops":0,"org":null,"size_in_mb":10000,"storage_profile":"SSD","thin_provisioned":true,"unit_number":1,"vapp_name":"test","vdc":null,"vm_name":"test01.testservers"},"sensitive_attributes":[],"private":"bnVsbA==","dependencies":["random_password.admin_pass","vcd_vapp.vapp","vcd_vapp_org_network.routed_network","vcd_vapp_vm.vm"]},{"index_key":"test01.testservers-2","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"allow_vm_reboot":true,"bus_number":0,"bus_type":"paravirtual","id":"2002","iops":0,"org":null,"size_in_mb":5480,"storage_profile":"SSD","thin_provisioned":true,"unit_number":2,"vapp_name":"test","vdc":null,"vm_name":"test01.testservers"},"sensitive_attributes":[],"private":"bnVsbA==","dependencies":["random_password.admin_pass","vcd_vapp.vapp","vcd_vapp_org_network.routed_network","vcd_vapp_vm.vm"]}]}],"check_results":null}

View File

@ -0,0 +1,26 @@
# This file is maintained automatically by "tofu init".
# Manual edits may be lost in future updates.
provider "registry.opentofu.org/hashicorp/local" {
version = "2.5.1"
constraints = "2.5.1"
hashes = [
"h1:GgW5qncKu4KnXLE1ZYv5iwmhSYtTNzsOvJAOQIyFR7E=",
]
}
provider "registry.opentofu.org/hashicorp/random" {
version = "3.5.1"
constraints = "3.5.1"
hashes = [
"h1:tW+G7lgqbHUtraKHPWuotYHlME1vcAf50YvOeHQlGHg=",
]
}
provider "registry.opentofu.org/vmware/vcd" {
version = "3.14.1"
constraints = "3.14.1"
hashes = [
"h1:BR77ewAJ1Z88VnU+68KPrD2hxNFEusBPRYcrG97G+gQ=",
]
}

View File

@ -0,0 +1 @@
{"version":4,"terraform_version":"1.10.7","serial":28,"lineage":"31b324f3-6ba4-4920-3b1c-039429f92d92","outputs":{},"resources":[{"mode":"managed","type":"random_password","name":"admin_pass","provider":"provider[\"registry.opentofu.org/hashicorp/random\"]","instances":[{"schema_version":3,"attributes":{"bcrypt_hash":"$2a$10$BdZVqaOScpzgidDxxxB8a.RpunbgGx2UuJLa2OmzZlZP5V/T6QFJa","id":"none","keepers":null,"length":20,"lower":true,"min_lower":0,"min_numeric":0,"min_special":0,"min_upper":0,"number":true,"numeric":true,"override_special":null,"result":"ZXR3ianjPuyOJRal7wvj","special":false,"upper":true},"sensitive_attributes":[[{"type":"get_attr","value":"result"}],[{"type":"get_attr","value":"bcrypt_hash"}]]}]},{"mode":"managed","type":"vcd_vapp","name":"vapp","instances":[{"index_key":"test","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"description":"","guest_properties":null,"href":"https://sandbox.nubes.ru/api/vApp/vapp-ea1d3265-2b6e-4921-bb6f-d488bf1a2460","id":"urn:vcloud:vapp:ea1d3265-2b6e-4921-bb6f-d488bf1a2460","inherited_metadata":{},"lease":[{"runtime_lease_in_sec":0,"storage_lease_in_sec":0}],"metadata":{},"metadata_entry":[],"name":"test","org":null,"power_on":false,"status":1,"status_text":"RESOLVED","vapp_network_names":[],"vapp_org_network_names":[],"vdc":null,"vm_names":[]},"sensitive_attributes":[],"private":"bnVsbA=="}]},{"mode":"managed","type":"vcd_vapp_org_network","name":"routed_network","instances":[{"index_key":"test","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"id":"urn:vcloud:network:ad5d19c4-c426-4506-b317-1292782bdec7","is_fenced":false,"org":null,"org_network_name":"dev-mgmt-network","reboot_vapp_on_removal":true,"retain_ip_mac_enabled":false,"vapp_name":"test","vdc":null},"sensitive_attributes":[],"private":"bnVsbA==","dependencies":["vcd_vapp.vapp"]}]},{"mode":"managed","type":"vcd_vapp_vm","name":"vm","instances":[{"index_key":"test01.testservers","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"accept_all_eulas":true,"boot_image":null,"boot_image_id":null,"boot_options":[{"boot_delay":0,"boot_retry_delay":10000,"boot_retry_enabled":false,"efi_secure_boot":false,"enter_bios_setup_on_next_boot":false}],"catalog_name":"dev","computer_name":"test01.testservers","consolidate_disks_on_create":false,"copy_from_vm_id":null,"cpu_cores":1,"cpu_hot_add_enabled":false,"cpu_limit":null,"cpu_priority":"","cpu_reservation":null,"cpu_shares":null,"cpus":1,"customization":[{"admin_password":"ZXR3ianjPuyOJRal7wvj","allow_local_admin_password":true,"auto_generate_password":false,"change_sid":false,"enabled":true,"force":false,"initscript":"","join_domain":false,"join_domain_account_ou":"","join_domain_name":"","join_domain_password":"","join_domain_user":"","join_org_domain":false,"must_change_password_on_first_login":false,"number_of_auto_logons":0}],"description":"Template Ubuntu_24-20G","disk":[],"expose_hardware_virtualization":false,"extra_config":[{"key":"vmotion.checkpointSVGAPrimarySize","required":false,"value":"4194304"},{"key":"pciBridge0.present","required":true,"value":"TRUE"},{"key":"vmware.tools.internalversion","required":false,"value":"12421"},{"key":"vmware.tools.requiredversion","required":false,"value":"12448"},{"key":"disk.EnableUUID","required":true,"value":"TRUE"},{"key":"sched.swap.derivedName","required":false,"value":"/vmfs/volumes/66f13602-e2679498-497a-48df3709874c/test01.testservers-qOAS/test01.testservers-qOAS-8b5caf0d.vswp"},{"key":"pciBridge1.virtualDev","required":false,"value":"pciRootBridge"},{"key":"cloud.uuid","required":false,"value":"40da131c-c679-4b9c-8347-46dd41aa43ab"},{"key":"nvram","required":false,"value":"test01.testservers-qOAS.nvram"},{"key":"vmotion.svga.mobMaxSize","required":false,"value":"4194304"},{"key":"tools.guest.desktop.autolock","required":true,"value":"TRUE"},{"key":"pciBridge0.functions","required":true,"value":"1"},{"key":"pciBridge1:0.pxm","required":false,"value":"0"},{"key":"scsi0.sasWWID","required":false,"value":"50 05 05 67 7f c2 81 f0"},{"key":"cpuid.coresPerSocket.cookie","required":true,"value":"1"},{"key":"migrate.migrationId","required":false,"value":"0"},{"key":"hpet0.present","required":true,"value":"TRUE"},{"key":"migrate.hostLog","required":false,"value":"test01.testservers-qOAS-74c531ab.hlog"},{"key":"tools.deploypkg.filename","required":false,"value":"cust6465156125709420514.cab"},{"key":"numa.autosize.cookie","required":false,"value":"10012"},{"key":"vmotion.svga.graphicsMemoryKB","required":false,"value":"4096"},{"key":"monitor.phys_bits_used","required":false,"value":"45"},{"key":"svga.present","required":true,"value":"TRUE"},{"key":"vmxstats.filename","required":false,"value":"test01.testservers-qOAS.scoreboard"},{"key":"ethernet0.pciSlotNumber","required":false,"value":"33"},{"key":"scsi0.pciSlotNumber","required":false,"value":"32"},{"key":"pciBridge0.pxm","required":false,"value":"-1"},{"key":"pciBridge0.virtualDev","required":false,"value":"pciRootBridge"},{"key":"pciBridge1.functions","required":true,"value":"1"},{"key":"migrate.hostLogState","required":false,"value":"none"},{"key":"softPowerOff","required":false,"value":"FALSE"},{"key":"viv.moid","required":false,"value":"8b3e0bd6-5231-468f-aad7-fd0d31752da0:vm-14802:Z5v2PSS+Os7E/F2DOfV4bViCSxoQXWmvFE9q1LLp/2s="},{"key":"scsi0:0.redo","required":false,"value":""},{"key":"guestinfo.ovfEnv","required":false,"value":""},{"key":"numa.autosize.vcpu.maxPerVirtualNode","required":true,"value":"1"},{"key":"pciBridge1.present","required":true,"value":"TRUE"},{"key":"sched.cpu.latencySensitivity","required":false,"value":"normal"},{"key":"vmotion.checkpointFBSize","required":false,"value":"4194304"}],"firmware":"efi","guest_properties":{"user-data":"I2Nsb3VkLWNvbmZpZwpob3N0bmFtZTogdGVzdDAxLnRlc3RzZXJ2ZXJzCnBhY2thZ2VfdXBkYXRlOiB0cnVlCnBhY2thZ2VfdXBncmFkZTogZmFsc2UKcGFja2FnZXM6CiAgLSBjdXJsCiAgLSBnaXQKICAtIGpxCgp1c2VyczoKICAtIG5hbWU6IGRlcGxveQogICAgc3VkbzogICAiQUxMPShBTEwpIE5PUEFTU1dEOkFMTCIKICAgIGdyb3VwczogInN1ZG8iCiAgICBzaGVsbDogL2Jpbi9iYXNoCiAgICBzc2hfYXV0aG9yaXplZF9rZXlzOgogICAgICAtIHNzaC1lZDI1NTE5ICoqKioqKioqKgo="},"hardware_version":"vmx-21","href":"https://sandbox.nubes.ru/api/vApp/vm-abd228e7-e3db-4dbf-860c-b40cd6fe8262","id":"urn:vcloud:vm:abd228e7-e3db-4dbf-860c-b40cd6fe8262","imported":false,"inherited_metadata":{"vm.origin.id":"db7d48b8-b376-4bb0-8b70-b86aa5ed4d11","vm.origin.name":"Ubuntu_24-20G","vm.origin.type":"com.vmware.vcloud.entity.vm"},"internal_disk":[{"bus_number":0,"bus_type":"paravirtual","disk_id":"2000","iops":0,"size_in_mb":35000,"storage_profile":"SSD","thin_provisioned":true,"unit_number":0}],"memory":1024,"memory_hot_add_enabled":false,"memory_limit":null,"memory_priority":"","memory_reservation":null,"memory_shares":null,"metadata":{},"metadata_entry":[],"name":"test01.testservers","network":[{"adapter_type":"VMXNET3","connected":true,"ip":"10.80.0.2","ip_allocation_mode":"POOL","is_primary":true,"mac":"00:50:56:04:11:31","name":"dev-mgmt-network","secondary_ip":"","secondary_ip_allocation_mode":"NONE","type":"org"}],"network_dhcp_wait_seconds":null,"org":null,"os_type":"ubuntu64Guest","override_template_disk":[{"bus_number":0,"bus_type":"paravirtual","iops":null,"size_in_mb":35000,"storage_profile":"","unit_number":0}],"placement_policy_id":"","power_on":true,"prevent_update_power_off":false,"security_tags":[],"set_extra_config":[{"key":"disk.EnableUUID","value":"TRUE"}],"sizing_policy_id":"urn:vcloud:vdcComputePolicy:6a68b02d-4b42-4830-83ff-afbde2f16b0c","status":4,"status_text":"POWERED_ON","storage_profile":"SSD","template_name":"Ubuntu_24-20G","vapp_id":"urn:vcloud:vapp:ea1d3265-2b6e-4921-bb6f-d488bf1a2460","vapp_name":"test","vapp_template_id":null,"vdc":null,"vm_name_in_template":null,"vm_type":"vcd_vapp_vm"},"sensitive_attributes":[[{"type":"get_attr","value":"customization"},{"type":"index","value":{"value":0,"type":"number"}},{"type":"get_attr","value":"join_domain_password"}],[{"type":"get_attr","value":"customization"},{"type":"index","value":{"value":0,"type":"number"}},{"type":"get_attr","value":"admin_password"}]],"private":"bnVsbA==","dependencies":["random_password.admin_pass","vcd_vapp.vapp","vcd_vapp_org_network.routed_network"]}]},{"mode":"managed","type":"vcd_vm_internal_disk","name":"vmdisk","instances":[{"index_key":"test01.testservers-1","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"allow_vm_reboot":true,"bus_number":0,"bus_type":"paravirtual","id":"2001","iops":0,"org":null,"size_in_mb":10000,"storage_profile":"SSD","thin_provisioned":true,"unit_number":1,"vapp_name":"test","vdc":null,"vm_name":"test01.testservers"},"sensitive_attributes":[],"private":"bnVsbA==","dependencies":["random_password.admin_pass","vcd_vapp.vapp","vcd_vapp_org_network.routed_network","vcd_vapp_vm.vm"]},{"index_key":"test01.testservers-2","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"allow_vm_reboot":true,"bus_number":0,"bus_type":"paravirtual","id":"2002","iops":0,"org":null,"size_in_mb":5480,"storage_profile":"SSD","thin_provisioned":true,"unit_number":2,"vapp_name":"test","vdc":null,"vm_name":"test01.testservers"},"sensitive_attributes":[],"private":"bnVsbA==","dependencies":["random_password.admin_pass","vcd_vapp.vapp","vcd_vapp_org_network.routed_network","vcd_vapp_vm.vm"]}]}],"check_results":null}

View File

@ -0,0 +1 @@
{"version":4,"terraform_version":"1.10.7","serial":24,"lineage":"31b324f3-6ba4-4920-3b1c-039429f92d92","outputs":{},"resources":[{"mode":"managed","type":"random_password","name":"admin_pass","provider":"provider[\"registry.opentofu.org/hashicorp/random\"]","instances":[{"schema_version":3,"attributes":{"bcrypt_hash":"$2a$10$BdZVqaOScpzgidDxxxB8a.RpunbgGx2UuJLa2OmzZlZP5V/T6QFJa","id":"none","keepers":null,"length":20,"lower":true,"min_lower":0,"min_numeric":0,"min_special":0,"min_upper":0,"number":true,"numeric":true,"override_special":null,"result":"ZXR3ianjPuyOJRal7wvj","special":false,"upper":true},"sensitive_attributes":[[{"type":"get_attr","value":"bcrypt_hash"}],[{"type":"get_attr","value":"result"}]]}]},{"mode":"managed","type":"vcd_vapp","name":"vapp","instances":[{"index_key":"test","provider":"provider[\"registry.opentofu.org/vmware/vcd\"].al[\"test\"]","schema_version":0,"attributes":{"description":"","guest_properties":null,"href":"https://sandbox.nubes.ru/api/vApp/vapp-a5baf899-7dc3-4ad9-a3f3-a7f2511ec9dd","id":"urn:vcloud:vapp:a5baf899-7dc3-4ad9-a3f3-a7f2511ec9dd","inherited_metadata":{},"lease":[{"runtime_lease_in_sec":0,"storage_lease_in_sec":0}],"metadata":{},"metadata_entry":[],"name":"test","org":"dev","power_on":null,"status":1,"status_text":"RESOLVED","vapp_network_names":[],"vapp_org_network_names":[],"vdc":"dev","vm_names":[]},"sensitive_attributes":[],"private":"eyJzY2hlbWFfdmVyc2lvbiI6IjAifQ=="}]}],"check_results":null}

View File

@ -1,36 +0,0 @@
# ---> Terraform
# Local .terraform directories
**/.terraform/*
# .tfstate files
*.tfstate
*.tfstate.*
# Crash log files
crash.log
crash.*.log
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
# *.tfvars
*.tfvars.json
# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json
# Include override files you do wish to add to version control using negated pattern
# !example_override.tf
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*
# Ignore CLI configuration files
.terraformrc
terraform.rc
.terraform.lock.hcl

View File

@ -1,120 +0,0 @@
# Развёртывание ВМ в VMware Cloud Director через tf
Используется **OpenTofu** (`tofu`). Конфигурация создаёт виртуальные машины в vCD: можно задать несколько ВМ, размеры CPU/RAM/дисков и сеть.
---
## Быстрый старт
1. **Установите OpenTofu** ([opentofu.org](https://opentofu.org)).
2. **Задайте переменные окружения** (доступ к vCD):
```bash
export TF_VAR_vmware_username="ваш_пользователь_vCD"
export TF_VAR_vmware_password="ваш_пароль_vCD"
```
Пароль администратора ВМ можно не задавать — тогда он сгенерируется автоматически (см. `tools.tf`). Чтобы задать свой: `export TF_VAR_admin_password="ваш_пароль"`.
3. **Отредактируйте `terraform.tfvars`** — укажите нужный vDC, имя vApp, параметры ВМ (см. раздел «Конфигурация» ниже).
4. **Разверните инфраструктуру:**
```bash
tofu init
tofu plan
tofu apply
```
---
## Конфигурация
### Переменные окружения
Обязательные для доступа к vCD:
- `TF_VAR_vmware_username` — пользователь VMware Cloud Director
- `TF_VAR_vmware_password` — пароль VMware Cloud Director
Опционально: `TF_VAR_admin_password` — пароль администратора на ВМ (если не задан, генерируется автоматически).
```
vcds = {
"vdcconfiguration1" = {
url = "https://ngcloud.ru/api"
org = "dev"
vdc = "dev"
network_routed = "dev-mgmt-network"
servers = {
"vappname01" = {
"vmname01" = {
cpu = "4"
memory = "4096"
osDisk = "16384"
dataDisk = {
"1" = "30720"
"2" = "15360"
}
network = {
mode = "auto"
ip = ""
}
catalog_name = "dev"
template_name = "RockyLinux_9-16G-customize"
}
}
}
}
}
```
Переменная задаётся в `terraform.tfvars`; схема — в [var.tf](var.tf), использование — [provider.tf](provider.tf), [vapp.tf](vapp.tf), [vm.tf](vm.tf), [local.tf](local.tf).
*** Ключ vcds — произвольное имя контура (можно несколько vDC в одной конфигурации) ***
```
vcds = {
"test" = {
...
}
}
```
*** Настройка vDC ***
```
url = URL API Cloud Director (https://<хост>/api)
org = имя организации
vdc = имя vDC
network_routed = имя routed-сети, куда подключаются ВМ
```
*** Настройка vApp (ключи внутри servers — имена vApp) ***
```
servers = {
"testservers" = { ... } # первый vApp
"testvapp2" = { ... } # второй vApp
}
```
*** Настройка сервера (параметры ВМ) ***
```
"testservers" = {
"test01" = {
cpu = кол-во ядер CPU
memory = объём RAM (МБ)
osDisk = размер системного диска (МБ)
dataDisk = { # ключ — unit, значение — размер в МБ
"1" = "30720"
"2" = "15360"
}
network = { # mode "auto" (IP из пула) или "manual" (указать ip)
mode = "auto"
ip = ""
}
network = mode "auto" (IP из пула) или "manual" (указать ip)
mode = "auto"
ip = ""
catalog_name = каталог с шаблоном
template_name = имя шаблона образа
# опционально (cloud-init):
init_username = "deploy"
ssh_authorized_keys = ["ssh-ed25519 AAAA..."]
}
```

View File

@ -1,39 +0,0 @@
locals {
#######################
admin_password = var.admin_password != "" ? var.admin_password : random_password.admin_pass.result
#######################
# Получаем объект с ключами в виде имен серверов и содержимым всего,
# что мы хотим видеть при передаче из vars
servers = merge([
for vcd_key, vcd_config in var.vcds :
merge([
for server_group, servers in vcd_config.servers :
{
for server_name, server_config in servers :
"${server_name}.${server_group}" => {
vcd_key = vcd_key
server_group = server_group
server_name = server_name
config = server_config
network_routed = vcd_config.network_routed
role = server_group
}
}
]...)
]...)
# Получаем объект с ключами в виде сервера-uidдиска,
# и содержимым в виде его сайзинга
disks = merge([
for serverName, serverConfig in local.servers:
{
for diskUid, diskSize in serverConfig.config.dataDisk:
"${serverName}-${diskUid}" => {
vcd_key = serverConfig.vcd_key
vm_name = serverName
unit_num = diskUid
disk_size = diskSize
}
}
]...)
}

View File

@ -1,37 +0,0 @@
terraform {
required_providers {
vcd = {
source = "vmware/vcd"
version = "3.14.1"
}
random = {
source = "hashicorp/random"
version = "3.5.1"
}
local = {
source = "hashicorp/local"
version = "2.5.1"
}
}
}
# Почему такая конфигурация не будет работать
# https://github.com/hashicorp/terraform/issues/24476
#
# Но решили тут
# https://github.com/opentofu/opentofu/issues/2123
provider "vcd" {
alias = "al"
for_each = var.vcds
user = var.vmware_username
password = var.vmware_password
org = each.value.org
vdc = each.value.vdc
url = each.value.url
max_retry_timeout = "10"
allow_unverified_ssl = "true"
}

View File

@ -1,22 +0,0 @@
#cloud-config
hostname: ${hostname}
package_update: true
package_upgrade: false
packages:
- curl
- git
- jq
users:
- name: ${username}
sudo: "ALL=(ALL) NOPASSWD:ALL"
groups: "sudo"
shell: /bin/bash
ssh_authorized_keys:
%{ if length(ssh_authorized_keys) > 0 ~}
%{ for key in ssh_authorized_keys ~}
- ${key}
%{ endfor ~}
%{ else ~}
[]
%{ endif ~}

View File

@ -1,39 +0,0 @@
#######################################################
# Импортируемые переменные из TF_VAR
# vmware_username = ""
# vmware_password = ""
#######################################################
vcds = {
"test" = {
url = "https://sandbox.nubes.ru/api"
org = "dev"
vdc = "dev"
network_routed = "dev-mgmt-network"
servers = {
"testservers" = {
"test01" = {
cpu = "1"
memory = "1024"
osDisk = "35000"
dataDisk = {
"1" = "10000"
"2" = "5480"
}
network = {
mode = "auto"
ip = ""
}
catalog_name = "dev"
template_name = "Ubuntu_24-20G"
init_username = "deploy"
ssh_authorized_keys = [
"ssh-ed25519 *********"
]
}
}
}
}
}

View File

@ -1,5 +0,0 @@
# Генерируем пароль для админского пользователя
resource "random_password" "admin_pass" {
length = 20
special = false
}

View File

@ -1,19 +0,0 @@
resource "vcd_vapp" "vapp" {
for_each = var.vcds
provider = vcd.al[each.key]
name = each.key
power_on = false
}
resource "vcd_vapp_org_network" "routed_network" {
for_each = vcd_vapp.vapp
provider = vcd.al[each.key]
vapp_name = each.value.name
org_network_name = var.vcds[each.key].network_routed
reboot_vapp_on_removal = true
}

View File

@ -1,42 +0,0 @@
####################################################
variable "vmware_username" {
type = string
default = ""
}
variable "vmware_password" {
type = string
default = ""
}
####################################################
# Пароль от ВМ (если пустой подставляется сгенерированный из tools.tf)
variable "admin_password" {
type = string
default = ""
}
####################################################
variable "vcds" {
type = map(object({
url = string
org = string
vdc = string
network_routed = string
servers = map(map(object({
cpu = string
memory = string
osDisk = string
catalog_name = string
template_name = string
dataDisk = map(string)
network = object({
mode = string
ip = string
})
# cloud-init: пользователь и SSH-ключи (опционально)
init_username = optional(string, "deploy")
ssh_authorized_keys = optional(list(string), [])
})))
}))
}
####################################################

View File

@ -1,84 +0,0 @@
resource "vcd_vapp_vm" "vm" {
for_each = local.servers
provider = vcd.al[each.value.vcd_key]
vapp_name = vcd_vapp.vapp[each.value.vcd_key].name
name = each.key
computer_name = each.key
catalog_name = each.value.config["catalog_name"]
template_name = each.value.config["template_name"]
memory = each.value.config["memory"]
cpus = each.value.config["cpu"]
network {
type = "org"
name = each.value.network_routed
ip_allocation_mode = lookup(each.value.config["network"], "mode", "auto") == "manual" ? "MANUAL" : "POOL"
is_primary = true
# Устанавливаем IP, только если режим "manual"
ip = lookup(each.value.config["network"], "mode", "auto") == "manual" ? lookup(each.value.config["network"], "ip", null) : null
}
override_template_disk {
bus_type = "paravirtual"
size_in_mb = each.value.config["osDisk"]
bus_number = 0
unit_number = 0
}
customization {
enabled = true
#force = var.forceRecustomization || !contains(var.servers, var.servers[count.index])
#force = var.forceRecustomization
force = false
allow_local_admin_password = true
auto_generate_password = false
admin_password = local.admin_password
}
set_extra_config {
key = "disk.EnableUUID"
value = "TRUE"
}
guest_properties = {
"user-data" = base64encode(templatefile("${path.module}/templates/cloudinit.yaml", {
hostname = each.key
username = each.value.config["init_username"]
ssh_authorized_keys = each.value.config["ssh_authorized_keys"]
}))
}
# Игноирование изменений дисков (PVC - Named Disks)
lifecycle {
ignore_changes = [
disk, # Игнорирует изменения всех дисков
]
}
depends_on = [
vcd_vapp_org_network.routed_network
]
}
resource "vcd_vm_internal_disk" "vmdisk" {
for_each = local.disks
provider = vcd.al[each.value.vcd_key]
vapp_name = vcd_vapp.vapp[each.value.vcd_key].name
vm_name = each.value.vm_name
bus_type = "paravirtual"
bus_number = 0
unit_number = each.value.unit_num
size_in_mb = each.value.disk_size
allow_vm_reboot = true
depends_on = [
vcd_vapp_vm.vm
]
}