alphax
alphax

Reputation: 25

Packer or terraform vsphere use case issue

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

Answers (0)

Related Questions