@@ -32,10 +32,25 @@ data "vsphere_network" "network" {
3232}
3333
3434data "vsphere_virtual_machine" "template" {
35+ count = var. content_library == null ? 1 : 0
3536 name = var. vmtemp
3637 datacenter_id = data. vsphere_datacenter . dc . id
3738}
3839
40+ data "vsphere_content_library" "library" {
41+ count = var. content_library != null ? 1 : 0
42+ name = var. content_library
43+ depends_on = [var . tag_depends_on ]
44+ }
45+
46+ data "vsphere_content_library_item" "library_item_template" {
47+ count = var. content_library != null ? 1 : 0
48+ library_id = data. vsphere_content_library . library [0 ]. id
49+ type = " ovf"
50+ name = var. vmtemp
51+ depends_on = [var . tag_depends_on ]
52+ }
53+
3954data "vsphere_tag_category" "category" {
4055 count = var. tags != null ? length (var. tags ) : 0
4156 name = keys (var. tags )[count . index ]
@@ -50,13 +65,13 @@ data "vsphere_tag" "tag" {
5065}
5166
5267data "vsphere_folder" "folder" {
53- count = var. vmfolder != null ? 1 : 0
54- path = " /${ data . vsphere_datacenter . dc . name } /vm/${ var . vmfolder } "
68+ count = var. vmfolder != null ? 1 : 0
69+ path = " /${ data . vsphere_datacenter . dc . name } /vm/${ var . vmfolder } "
5570}
5671
5772locals {
5873 interface_count = length (var. ipv4submask ) # Used for Subnet handeling
59- template_disk_count = length (data. vsphere_virtual_machine . template . disks )
74+ template_disk_count = var . content_library == null ? length (data. vsphere_virtual_machine . template [ 0 ] . disks ) : 0
6075}
6176
6277// Cloning a Linux or Windows VM from a given template.
@@ -71,9 +86,9 @@ resource "vsphere_virtual_machine" "vm" {
7186 custom_attributes = var. custom_attributes
7287 annotation = var. annotation
7388 extra_config = var. extra_config
74- firmware = var. firmware == null ? data. vsphere_virtual_machine . template . firmware : var. firmware
75- efi_secure_boot_enabled = var. efi_secure_boot == null ? data. vsphere_virtual_machine . template . efi_secure_boot_enabled : var. efi_secure_boot
76- enable_disk_uuid = var. enable_disk_uuid == null ? data. vsphere_virtual_machine . template . enable_disk_uuid : var. enable_disk_uuid
89+ firmware = var. content_library == null && var . firmware == null ? data. vsphere_virtual_machine . template [ 0 ] . firmware : var. firmware
90+ efi_secure_boot_enabled = var. content_library == null && var . efi_secure_boot == null ? data. vsphere_virtual_machine . template [ 0 ] . efi_secure_boot_enabled : var. efi_secure_boot
91+ enable_disk_uuid = var. content_library == null && var . enable_disk_uuid == null ? data. vsphere_virtual_machine . template [ 0 ] . enable_disk_uuid : var. enable_disk_uuid
7792 storage_policy_id = var. storage_policy_id
7893
7994 datastore_cluster_id = var. datastore_cluster != " " ? data. vsphere_datastore_cluster . datastore_cluster [0 ]. id : null
@@ -91,21 +106,21 @@ resource "vsphere_virtual_machine" "vm" {
91106 memory_hot_add_enabled = var. memory_hot_add_enabled
92107 memory_share_level = var. memory_share_level
93108 memory_share_count = var. memory_share_level == " custom" ? var. memory_share_count : null
94- guest_id = data. vsphere_virtual_machine . template . guest_id
109+ guest_id = var . content_library == null ? data. vsphere_virtual_machine . template [ 0 ] . guest_id : null
95110 scsi_bus_sharing = var. scsi_bus_sharing
96- scsi_type = var. scsi_type != " " ? var. scsi_type : data. vsphere_virtual_machine . template . scsi_type
111+ scsi_type = var. scsi_type != " " ? var. scsi_type : (var . content_library == null ? data. vsphere_virtual_machine . template [ 0 ] . scsi_type : null )
97112 scsi_controller_count = max (
98- max (0 ,flatten ([
113+ max (0 , flatten ([
99114 for item in values (var. data_disk ) : [
100115 for elem , val in item :
101116 elem == " data_disk_scsi_controller" ? val : 0
102- ]])... ) + 1 ,
103- ceil ((max (0 ,flatten ([
117+ ]])... ) + 1 ,
118+ ceil ((max (0 , flatten ([
104119 for item in values (var. data_disk ) : [
105120 for elem , val in item :
106121 elem == " unit_number" ? val : 0
107- ] ])... ) + 1 ) / 15 ),
108- var. scsi_controller )
122+ ] ])... ) + 1 ) / 15 ),
123+ var. scsi_controller )
109124 wait_for_guest_net_routable = var. wait_for_guest_net_routable
110125 wait_for_guest_ip_timeout = var. wait_for_guest_ip_timeout
111126 wait_for_guest_net_timeout = var. wait_for_guest_net_timeout
@@ -116,19 +131,36 @@ resource "vsphere_virtual_machine" "vm" {
116131 for_each = keys (var. network ) # data.vsphere_network.network[*].id #other option
117132 content {
118133 network_id = data. vsphere_network . network [network_interface . key ]. id
119- adapter_type = var. network_type != null ? var. network_type [network_interface . key ] : data. vsphere_virtual_machine . template . network_interface_types [0 ]
134+ adapter_type = var. network_type != null ? var. network_type [network_interface . key ] : (var . content_library == null ? data. vsphere_virtual_machine . template [ 0 ] . network_interface_types [0 ] : null )
120135 }
121136 }
122137 // Disks defined in the original template
123138 dynamic "disk" {
124- for_each = data. vsphere_virtual_machine . template . disks
139+ for_each = var . content_library == null ? data. vsphere_virtual_machine . template [ 0 ] . disks : []
125140 iterator = template_disks
126141 content {
127142 label = length (var. disk_label ) > 0 ? var. disk_label [template_disks . key ] : " disk${ template_disks . key } "
128- size = var. disk_size_gb != null ? var. disk_size_gb [template_disks . key ] : data. vsphere_virtual_machine . template . disks [template_disks . key ]. size
143+ size = var. disk_size_gb != null ? var. disk_size_gb [template_disks . key ] : data. vsphere_virtual_machine . template [ 0 ] . disks [template_disks . key ]. size
129144 unit_number = var. scsi_controller != null ? var. scsi_controller * 15 + template_disks. key : template_disks. key
130- thin_provisioned = data. vsphere_virtual_machine . template . disks [template_disks . key ]. thin_provisioned
131- eagerly_scrub = data. vsphere_virtual_machine . template . disks [template_disks . key ]. eagerly_scrub
145+ thin_provisioned = data. vsphere_virtual_machine . template [0 ]. disks [template_disks . key ]. thin_provisioned
146+ eagerly_scrub = data. vsphere_virtual_machine . template [0 ]. disks [template_disks . key ]. eagerly_scrub
147+ datastore_id = var. disk_datastore != " " ? data. vsphere_datastore . disk_datastore [0 ]. id : null
148+ storage_policy_id = length (var. template_storage_policy_id ) > 0 ? var. template_storage_policy_id [template_disks . key ] : null
149+ io_reservation = length (var. io_reservation ) > 0 ? var. io_reservation [template_disks . key ] : null
150+ io_share_level = length (var. io_share_level ) > 0 ? var. io_share_level [template_disks . key ] : " normal"
151+ io_share_count = length (var. io_share_level ) > 0 && var. io_share_level [template_disks . key ] == " custom" ? var. io_share_count [template_disks . key ] : null
152+ }
153+ }
154+ // Disk for template from Content Library
155+ dynamic "disk" {
156+ for_each = var. content_library == null ? [] : [1 ]
157+ iterator = template_disks
158+ content {
159+ label = length (var. disk_label ) > 0 ? var. disk_label [template_disks . key ] : " disk${ template_disks . key } "
160+ size = var. disk_size_gb [template_disks . key ]
161+ unit_number = var. scsi_controller != null ? var. scsi_controller * 15 + template_disks. key : template_disks. key
162+ // thin_provisioned = data.vsphere_virtual_machine.template[0].disks[template_disks.key].thin_provisioned
163+ // eagerly_scrub = data.vsphere_virtual_machine.template[0].disks[template_disks.key].eagerly_scrub
132164 datastore_id = var. disk_datastore != " " ? data. vsphere_datastore . disk_datastore [0 ]. id : null
133165 storage_policy_id = length (var. template_storage_policy_id ) > 0 ? var. template_storage_policy_id [template_disks . key ] : null
134166 io_reservation = length (var. io_reservation ) > 0 ? var. io_reservation [template_disks . key ] : null
@@ -142,26 +174,26 @@ resource "vsphere_virtual_machine" "vm" {
142174 for_each = var. data_disk
143175 iterator = terraform_disks
144176 content {
145- label = terraform_disks. key
146- size = lookup (terraform_disks. value , " size_gb" , null )
177+ label = terraform_disks. key
178+ size = lookup (terraform_disks. value , " size_gb" , null )
147179 unit_number = (
148180 lookup (
149- terraform_disks. value ,
150- " unit_number" ,
181+ terraform_disks. value ,
182+ " unit_number" ,
151183 - 1
152- ) < 0 ? (
184+ ) < 0 ? (
153185 lookup (
154- terraform_disks. value ,
155- " data_disk_scsi_controller" ,
186+ terraform_disks. value ,
187+ " data_disk_scsi_controller" ,
156188 0
157- ) > 0 ? (
189+ ) > 0 ? (
158190 (terraform_disks. value . data_disk_scsi_controller * 15 ) +
159- index (keys (var. data_disk ), terraform_disks. key ) +
191+ index (keys (var. data_disk ), terraform_disks. key ) +
160192 (var. scsi_controller == tonumber (terraform_disks. value [" data_disk_scsi_controller" ]) ? local. template_disk_count : 0 )
161- ) : (
193+ ) : (
162194 index (keys (var. data_disk ), terraform_disks. key ) + local. template_disk_count
163195 )
164- ) : (
196+ ) : (
165197 tonumber (terraform_disks. value [" unit_number" ])
166198 )
167199 )
@@ -176,7 +208,7 @@ resource "vsphere_virtual_machine" "vm" {
176208 }
177209 }
178210 clone {
179- template_uuid = data. vsphere_virtual_machine . template . id
211+ template_uuid = var . content_library == null ? data. vsphere_virtual_machine . template [ 0 ] . id : data . vsphere_content_library_item . library_item_template [ 0 ] . id
180212 linked_clone = var. linked_clone
181213 timeout = var. timeout
182214
@@ -214,12 +246,12 @@ resource "vsphere_virtual_machine" "vm" {
214246 content {
215247 ipv4_address = split (" /" , var. network [keys (var. network )[network_interface . key ]][count . index ])[0 ]
216248 ipv4_netmask = var. network [keys (var. network )[network_interface . key ]][count . index ] == " " ? null : (
217- length (split (" /" , var. network [keys (var. network )[network_interface . key ]][count . index ])) == 2 ? (
218- split (" /" , var. network [keys (var. network )[network_interface . key ]][count . index ])[1 ]
219- ) : (
220- length (var. ipv4submask ) == 1 ? var. ipv4submask [0 ] : var. ipv4submask [network_interface . key ]
221- )
222- )
249+ length (split (" /" , var. network [keys (var. network )[network_interface . key ]][count . index ])) == 2 ? (
250+ split (" /" , var. network [keys (var. network )[network_interface . key ]][count . index ])[1 ]
251+ ) : (
252+ length (var. ipv4submask ) == 1 ? var. ipv4submask [0 ] : var. ipv4submask [network_interface . key ]
253+ )
254+ )
223255 }
224256 }
225257 dns_server_list = var. dns_server_list
0 commit comments