Reputation: 25
I encounter a weird issue using Packer and Terraform on VSphere. To be honest, I couldn't not identified if it's a Packer issue or a Terraform issue.
Packer files
/*
DESCRIPTION:
Microsoft Windows Server 2022 Datacenter variables used by the Packer Plugin for VMware vSphere (vsphere-iso).
*/
// Guest Operating System Metadata
vm_guest_os_language = "en-US"
vm_guest_os_keyboard = "fr-FR"
vm_guest_os_timezone = "Romance Standard Time"
vm_guest_os_vendor = "microsoft"
vm_guest_os_family = "windows"
vm_guest_os_member = "server"
vm_guest_os_version = "2022"
vm_guest_os_ed_datacenter = "datacenter"
vm_guest_os_exp_desktop = "dexp"
os_image = "Windows Server 2022 SERVERDATACENTER"
communicator = "winrm"
kms_key = ""
vm_name = "win22pck-tmp"
// Virtual Machine Guest Operating System Setting
vm_guest_os_type = "windows9Server64Guest"
// Virtual Machine Hardware Settings
vm_firmware = "efi-secure"
vm_cdrom_type = "sata"
vm_cpu_sockets = 2
vm_cpu_cores = 2
vm_cpu_hot_add = true
vm_mem_size = 4096
vm_mem_hot_add = true
vm_disk_size = 102400
vm_disk_controller_type = ["pvscsi"]
vm_disk_thin_provisioned = true
vm_network_card = "vmxnet3"
// Removable Media Settings
iso_path = "ISO - Woodpecker"
iso_file = "Win_Server_2022_last_cu.ISO"
iso_checksum_type = "sha256"
iso_checksum_value = "3435F489AF307F6E9986E4EBC4B0C234EF1FDC406DC0A8BB34E2E425EE72E800"
// Boot Settings
vm_boot_order = "disk,cdrom"
vm_boot_wait = "2s"
vm_boot_command = ["<spacebar>"]
vm_shutdown_command = "shutdown /s /t 10 /f /d p:4:1 /c \"Shutdown by Packer\""
// Communicator Settings
communicator_port = 5986
communicator_timeout = "12h"
build_winrm_use_ssl = "true"
build_winrm_insecure = "true"
build_winrm_use_ntlm = "true"
// Provisioner Settings
scripts = ["scripts/windows/windows-server-prepare.ps1"]
inline = [
"Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))",
"choco feature enable -n allowGlobalConfirmation",
"Get-EventLog -LogName * | ForEach { Clear-EventLog -LogName $_.Log }"
]
root_path = "/pipelines/images/Packer"
And here are the terraform files:
provider "vsphere" {
vsphere_server = var.vsphere_server
user = var.vsphere_username
password = var.vsphere_password
allow_unverified_ssl = true
}
provider "azurerm" {
features {}
}
resource "random_password" "vm_admin_password" {
length = 16
special = true
override_special = "!#$%&*()-_=+[]{}<>:?"
}
# Awx account service
data "azurerm_key_vault" "compute_lab" {
name = var.key_vault_name
resource_group_name = var.resource_group
}
data "azurerm_key_vault_secret" "awx_password" {
name = ""
key_vault_id = data.azurerm_key_vault.compute_lab.id
}
data "azurerm_key_vault_secret" "awx_account" {
name = ""
key_vault_id = data.azurerm_key_vault.compute_lab.id
}
data "azurerm_key_vault_secret" "vsphere_username" {
name = ""
key_vault_id = data.azurerm_key_vault.compute_lab.id
}
data "azurerm_key_vault_secret" "vsphere_password" {
name = ""
key_vault_id = data.azurerm_key_vault.compute_lab.id
}
data "vsphere_datacenter" "datacenter" {
name = var.vsphere_datacenter
}
data "vsphere_network" "network" {
name = var.vsphere_network
datacenter_id = data.vsphere_datacenter.datacenter.id
}
data "vsphere_compute_cluster" "cluster" {
name = var.vsphere_cluster
datacenter_id = data.vsphere_datacenter.datacenter.id
}
data "vsphere_resource_pool" "pool" {
name = format("%s%s", data.vsphere_compute_cluster.cluster.name, "/Resources")
datacenter_id = data.vsphere_datacenter.datacenter.id
}
data "vsphere_datastore" "datastore" {
name = var.vsphere_datastore
datacenter_id = data.vsphere_datacenter.datacenter.id
}
data "vsphere_content_library" "content_library" {
name = var.vsphere_content_library
}
data "vsphere_content_library_item" "content_library_item" {
name = var.vsphere_content_library_ovf
type = "ovf"
library_id = data.vsphere_content_library.content_library.id
}
locals {
tag_environment_map = {
"prod" = {
real_name = "PROD"
}
"dev" = {
real_name = "DEV"
}
"uat" = {
real_name = "UAT"
}
}
}
resource "vsphere_virtual_machine" "vm" {
name = var.vm_name
folder = var.vsphere_folder
num_cpus = var.vm_cpus
memory = var.vm_memory
firmware = var.vm_firmware
efi_secure_boot_enabled = var.vm_efi_secure_boot_enabled
datastore_id = data.vsphere_datastore.datastore.id
resource_pool_id = data.vsphere_resource_pool.pool.id
guest_id = var.guest_id
network_interface {
network_id = data.vsphere_network.network.id
}
disk {
label = "${var.vm_name}-disk"
size = var.vm_disk_size
thin_provisioned = true
}
clone {
template_uuid = data.vsphere_content_library_item.content_library_item.id
customize {
windows_options {
computer_name = var.vm_name
join_domain = var.domain
domain_admin_user = data.azurerm_key_vault_secret.awx_account.value
domain_admin_password = data.azurerm_key_vault_secret.awx_password.value
run_once_command_list = var.run_once
admin_password = random_password.vm_admin_password.result
}
network_interface {
ipv4_address = var.vm_ipv4
ipv4_netmask = var.vm_ipv4_netmask
}
ipv4_gateway = var.vm_ipv4_gateway
dns_suffix_list = var.vm_dns_suffix_list
dns_server_list = var.vm_dns_server_list
}
}
lifecycle {
ignore_changes = [
clone[0].template_uuid,
]
}
}
vsphere_server = ""
vsphere_username = ""
vsphere_password = ""
# vSphere Settings
vsphere_datacenter = ""
vsphere_cluster = "DEV01"
vsphere_datastore = ""
vsphere_folder = "LAB"
vsphere_network = ""
vsphere_content_library = "Test"
vsphere_content_library_ovf = "winServer22-vsphere-tmp"
# Virtual Machines Settings
vm_name = "win-srv-2022-vm"
vm_cpus = 2
vm_memory = 8192
vm_disk_size = 100
vm_firmware = "efi"
vm_efi_secure_boot_enabled = true
vm_ipv4_netmask = "22"
vm_ipv4 = ""
vm_ipv4_gateway = ""
vm_dns_suffix_list = [""]
vm_dns_server_list = [""]
domain = ""
guest_id = "windows9Server64Guest"
key_vault_name = ""
resource_group = ""
##################################################################################
# VERSIONS
##################################################################################
terraform {
backend "azurerm" {
}
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>2.0"
}
vsphere = {
source = "hashicorp/vsphere"
version = "2.9.3"
}
}
}
And here are the logs from Terraform:
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# random_password.vm_admin_password will be created
+ resource "random_password" "vm_admin_password" {
+ bcrypt_hash = (sensitive value)
+ id = (known after apply)
+ length = 16
+ lower = true
+ min_lower = 0
+ min_numeric = 0
+ min_special = 0
+ min_upper = 0
+ number = true
+ numeric = true
+ override_special = "!#$%&*()-_=+[]{}<>:?"
+ result = (sensitive value)
+ special = true
+ upper = true
}
# vsphere_virtual_machine.vm will be created
+ resource "vsphere_virtual_machine" "vm" {
+ annotation = (known after apply)
+ boot_retry_delay = 10000
+ change_version = (known after apply)
+ cpu_limit = -1
+ cpu_share_count = (known after apply)
+ cpu_share_level = "normal"
+ datastore_id = "datastore-1106369"
+ default_ip_address = (known after apply)
+ efi_secure_boot_enabled = true
+ ept_rvi_mode = (known after apply)
+ extra_config_reboot_required = true
+ firmware = "efi"
+ folder = "LAB"
+ force_power_off = true
+ guest_id = "windows9Server64Guest"
+ guest_ip_addresses = (known after apply)
+ hardware_version = (known after apply)
+ host_system_id = (known after apply)
+ hv_mode = (known after apply)
+ id = (known after apply)
+ ide_controller_count = 2
+ imported = (known after apply)
+ latency_sensitivity = "normal"
+ memory = 8192
+ memory_limit = -1
+ memory_share_count = (known after apply)
+ memory_share_level = "normal"
+ migrate_wait_timeout = 30
+ moid = (known after apply)
+ name = "winServer22-vsphere"
+ num_cores_per_socket = 1
+ num_cpus = 2
+ power_state = (known after apply)
+ poweron_timeout = 300
+ reboot_required = (known after apply)
+ resource_pool_id = "resgroup-624797"
+ run_tools_scripts_after_power_on = true
+ run_tools_scripts_after_resume = true
+ run_tools_scripts_before_guest_shutdown = true
+ run_tools_scripts_before_guest_standby = true
+ sata_controller_count = 0
+ scsi_bus_sharing = "noSharing"
+ scsi_controller_count = 1
+ scsi_type = "pvscsi"
+ shutdown_wait_timeout = 3
+ storage_policy_id = (known after apply)
+ swap_placement_policy = "inherit"
+ sync_time_with_host = true
+ tools_upgrade_policy = "manual"
+ uuid = (known after apply)
+ vapp_transport = (known after apply)
+ vmware_tools_status = (known after apply)
+ vmx_path = (known after apply)
+ wait_for_guest_ip_timeout = 0
+ wait_for_guest_net_routable = true
+ wait_for_guest_net_timeout = 5
+ clone {
+ template_uuid = "db3901ba-61e2-4c85-be62-81d45f4f923e"
+ timeout = 30
+ customize {
+ dns_server_list = [
+ "",
+ "",
]
+ dns_suffix_list = [
+ "",
]
+ ipv4_gateway = ""
+ timeout = 10
+ network_interface {
+ ipv4_address = ""
+ ipv4_netmask = 22
}
+ windows_options {
+ admin_password = (sensitive value)
+ auto_logon_count = 1
+ computer_name = "winServer22-vsphere"
+ domain_admin_password = (sensitive value)
+ domain_admin_user = (sensitive value)
+ full_name = ""
+ join_domain = ""
+ organization_name = "Managed by Terraform"
+ run_once_command_list = [
+ "powershell.exe -sta -ExecutionPolicy Unrestricted Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile c:\\winrm_ansible.ps1",
+ "powershell.exe -sta -ExecutionPolicy Unrestricted -file C:\\winrm_ansible.ps1",
]
+ time_zone = 85
}
}
}
+ disk {
+ attach = false
+ controller_type = "scsi"
+ datastore_id = "<computed>"
+ device_address = (known after apply)
+ disk_mode = "persistent"
+ disk_sharing = "sharingNone"
+ eagerly_scrub = false
+ io_limit = -1
+ io_reservation = 0
+ io_share_count = 0
+ io_share_level = "normal"
+ keep_on_remove = false
+ key = 0
+ label = "winServer22-vsphere-disk"
+ path = (known after apply)
+ size = 100
+ storage_policy_id = (known after apply)
+ thin_provisioned = true
+ unit_number = 0
+ uuid = (known after apply)
+ write_through = false
}
+ network_interface {
+ adapter_type = "vmxnet3"
+ bandwidth_limit = -1
+ bandwidth_reservation = 0
+ bandwidth_share_count = (known after apply)
+ bandwidth_share_level = "normal"
+ device_address = (known after apply)
+ key = (known after apply)
+ mac_address = (known after apply)
+ network_id = "dvportgroup-673626"
}
}
Plan: 2 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ vm_CIDR = ""
+ vm_fqdn = "winServer22-vsphere."
+ vm_ip = ""
+ vm_name = "winServer22-vsphere"
+ vm_netmask = ""
random_password.vm_admin_password: Creating...
random_password.vm_admin_password: Creation complete after 0s [id=none]
vsphere_virtual_machine.vm: Creating...
vsphere_virtual_machine.vm: Still creating... [10s elapsed]
vsphere_virtual_machine.vm: Still creating... [20s elapsed]
vsphere_virtual_machine.vm: Still creating... [30s elapsed]
...
vsphere_virtual_machine.vm: Still creating... [1m50s elapsed]
╷
│ Error: cannot find OS family for guest ID "windows2019srvNext_64Guest": could not find guest ID "windows2019srvNext_64Guest"
│
│ with vsphere_virtual_machine.vm,
│ on main.tf line 94, in resource "vsphere_virtual_machine" "vm":
│ 94: resource "vsphere_virtual_machine" "vm" {
│
╵
Even if I specified the guest_id
value, terraform keeps on using the bad one...
I tried a few other guest_id
value, but it keeps on prompting this exact error message.
Upvotes: 0
Views: 59