Problem
After building an Ubuntu 20.04 (also tried 21.04) template with Packer I'm unable to set new settings when instantiating the template with Terraform. This config had no issues with Debian 10.
Packer
{
"builders": [
{
"CPUs": "{{user `vm-cpu-num`}}",
"RAM": "{{user `vm-mem-size`}}",
"RAM_reserve_all": true,
"boot_command": [
"<esc><esc><esc><esc>e<wait>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"<del><del><del><del><del><del><del><del>",
"linux /casper/vmlinuz --- autoinstall ds=\"nocloud-net;seedfrom=http://{{.HTTPIP}}:{{.HTTPPort}}/\"<enter><wait>",
"initrd /casper/initrd<enter><wait>",
"boot<enter>",
"<enter><f10><wait>"
],
"boot_wait": "3s",
"boot_order": "disk,cdrom",
"cluster": "{{user `cluster`}}",
"convert_to_template": "true",
"datastore": "{{user `datastore`}}",
"disk_controller_type": "pvscsi",
"folder": "{{user `folder`}}",
"guest_os_type": "ubuntu64Guest",
"host": "{{user `host`}}",
"http_directory": "http",
"http_port_min" : "8000",
"http_port_max" : "8000",
"insecure_connection": "true",
"iso_paths": ["{{user `iso-paths`}}"],
"network_adapters": [
{
"network": "{{user `network`}}",
"network_card": "vmxnet3"
}
],
"password": "{{user `vcenter-password`}}",
"shutdown_command": "echo '{{user `ssh-username`}}' | sudo -S shutdown -P now",
"ssh_username": "{{user `ssh-username`}}",
"ssh_password": "{{user `ssh-password`}}",
"ssh_timeout": "20m",
"ssh_handshake_attempts": "50",
"storage": [
{
"disk_size": "{{user `vm-disk-1-size`}}",
"disk_thin_provisioned": true
}
],
"type": "vsphere-iso",
"username": "{{user `vcenter-username`}}",
"vcenter_server": "{{user `vcenter-server`}}",
"vm_name": "{{user `vm-name`}}"
}
],
"provisioners": [
{
"type": "shell",
"inline": ["curl -sSL https://raw.githubusercontent.com/vmware/cloud-init-vmware-guestinfo/master/install.sh | sudo sh -"]
},
{
"type": "shell",
"inline": ["mkdir $HOME/.ssh && echo {{ user `ssh-key` }} > $HOME/.ssh/authorized_keys"]
},
{
"type": "ansible",
"playbook_file": "../../ansible/packer.yml"
},
{
"inline": [
"echo 'Packer Template Build -- Complete'"
],
"type": "shell"
}
]
}
user-data file distributed by packer
#cloud-config
autoinstall:
version: 1
locale: en_US
packages:
- open-vm-tools
- python-is-python3
- cloud-init
keyboard:
layout: en
variant: us
network:
network:
version: 2
ethernets:
ens192:
dhcp4: true
dhcp-identifier: mac
storage:
layout:
name: lvm
identity:
hostname: ubuntu
username: ubuntu
password: $6$rounds=4096$8dkK1P/oE$2DGKKt0wLlTVJ7USY.0jN9du8FetmEr51yjPyeiR.zKE3DGFcitNL/nF1l62BLJNR87lQZixObuXYny.Mf17K1
ssh:
install-server: yes
user-data:
disable_root: false
late-commands:
- 'sed -i "s/dhcp4: true/&\n dhcp-identifier: mac/" /target/etc/netplan/00-installer-config.yaml'
- echo 'ubuntu ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/ubuntu
cleanup script called by Ansible provisionner
#!/bin/sh
set -e
# cloud init: move files and change permissions
#mv /tmp/cloud-init/* /etc/cloud/cloud.cfg.d/
chown -R root:root /etc/cloud/cloud.cfg.d/
# cleanup cloud-init data
rm -rf /var/lib/cloud/*
ln -s /var/lib/cloud/instances /var/lib/cloud/instance
# cleanup cloud-init logs
rm -rf /var/log/cloud-init*
# cleanup tmp files
rm -rf /tmp/cloud-init
truncate -s 0 /etc/machine-id
rm /var/lib/dbus/machine-id
ln -s /etc/machine-id /var/lib/dbus/machine-id
Terraform
main.tf
resource "vsphere_virtual_machine" "vm" {
name = "${var.hostname}"
#resource_pool_id = "${data.vsphere_compute_cluster.cluster.resource_pool_id}"
resource_pool_id = "${data.vsphere_resource_pool.pool.id}"
datastore_id = "${data.vsphere_datastore.datastore.id}"
num_cpus = var.vm_cpus
memory = var.vm_ram
guest_id = "${data.vsphere_virtual_machine.template.guest_id}"
scsi_type = "${data.vsphere_virtual_machine.template.scsi_type}"
network_interface {
network_id = "${data.vsphere_network.network.id}"
adapter_type = "${data.vsphere_virtual_machine.template.network_interface_types[0]}"
}
disk {
label = "disk0"
size = "${var.os_disk_size}"
eagerly_scrub = "${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}"
thin_provisioned = "${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}"
}
dynamic "disk" {
for_each = var.data_disk ? [1] :[]
content {
#All fields in the vsphere_virtual_disk resource are currently immutable and force a new resource if changed.
label = "disk1"
attach = true
path = "${vsphere_virtual_disk.data-disk[0].vmdk_path}"
unit_number = 1
datastore_id = "${data.vsphere_datastore.datastore.id}"
}
}
extra_config = {
"guestinfo.metadata" = base64gzip(templatefile("${path.module}/templates/metadata.tmpl", { hostname = var.hostname }))
"guestinfo.metadata.encoding" = "base64"
"guestinfo.userdata" = base64gzip(templatefile("${path.module}/templates/userdata.tmpl", {
hostname = var.hostname,
domain = var.domain
}))
"guestinfo.userdata.encoding" = "base64"
}
clone {
template_uuid = "${data.vsphere_virtual_machine.template.id}"
}
}
userdata.tmpl
#cloud-config
preserve_hostname: false
manage_etc_hosts: true
prefer_fqdn_over_hostname: true
fqdn: "${hostname}.${domain}"
runcmd:
- echo hello > /root/hello
- touch /root/lol
Cloud-init v. 21.2-3-g899bfaa9-0ubuntu2~21.04.1 finished at Tue, 28 Sep 2021 15:55:02 +0000. Datasource DataSourceNone. Up 19.12 seconds
2021-09-28 15:55:02,449 - cc_final_message.py[WARNING]: Used fallback datasource