Источник данных Terraform DataSourceNone с Ubuntu 20.04

#ubuntu #terraform #packer #cloud-init

Вопрос:

Проблема

После создания шаблона Ubuntu 20.04 (также попробовал 21.04) с помощью Packer я не могу установить новые настройки при создании экземпляра шаблона с помощью Terraform. У этой конфигурации не было проблем с Debian 10.

Пакер

 {
    "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 amp;amp; echo {{ user `ssh-key` }} > $HOME/.ssh/authorized_keys"]
    },
    {
        "type": "ansible",
        "playbook_file": "../../ansible/packer.yml"
    },
    {
        "inline": [
        "echo 'Packer Template Build -- Complete'"
        ],
        "type": "shell"
    }
    ]
}
 

файл пользовательских данных, распространяемый упаковщиком

 #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/amp;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}"
  }
}

 

данные пользователя.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
 

Ответ №1:

Проблема специфична для VMware vSphere. Чтобы исправить это :

 rm -rf /etc/cloud/cloud.cfg.d/subiquity-disable-cloudinit-networking.cfg
rm -rf /etc/cloud/cloud.cfg.d/99-installer.cfg