# MSVSphere Cloud Images

[Packer](https://www.packer.io/) templates and configuration files for
building MSVSphere images for various cloud platforms.


## Build environment configuration

Supported operating systems:

  * MSVSphere 9 and other EL9-compatible distributions
  * Fedora

First install Ansible, which we use for virtual machines provisioning:

```shell
$ dnf install ansible-core
```

Then follow the Packer installation [instructions](https://developer.hashicorp.com/packer/downloads?product_intent=packer).
Check the [packer-environment.pkr.hcl](packer-environment.pkr.hcl) file
for the required Packer version.

Alternatively, you can install a Packer binary from a Yandex
[mirror](https://hashicorp-releases.yandexcloud.net/packer/): just download a
latest version archive and unzip it somewhere in PATH (e.g. `~/.local/bin`).

Verify that Packer works:

```shell
$ packer version
1.10.0
```

In order to install required Packer plugins run the following command in the
project root:

```shell
$ packer init -upgrade .
```

Dependently on your network configuration, you may also need to open the
8000-9000 TCP port range so that Packer can serve kickstart files to VMs:

```shell
$ firewall-cmd --zone=public --add-port=8000-9000/tcp --permanent
$ firewall-cmd --reload
```

You will also need to install either QEMU/KVM or VirtualBox or
VMWare Workstation, depending on what types of images you are going to build.

For VirtualBox and VMWare Workstation just follow the official site
documentation.

The QEMU/KVM installation instructions are provided below:

```shell
# for MSVSphere 9
$ dnf install edk2-ovmf libvirt libvirt-daemon-kvm

# for Fedora
$ dnf install @virtualization
$ dnf install edk2-ovmf
```


## Building images

In order to build an image use the following command syntax:

```shell
$ packer build -only=${BUILDER}.${CONFIGURATION} .
```

where `${BUILDER}` is a Packer builder (e.g. `virtualbox-iso`) and
`${CONFIGURATION}` is an image configuration name (e.g. 
`msvsphere-9-vagrant-x86_64`).

On Fedora you might need to provide extra options because it has different
paths for qemu-kvm and edk2 firmware:

```shell
$ packer build -var qemu_binary=/usr/bin/qemu-kvm \
      -var uefi_ovmf_code=/usr/share/OVMF/OVMF_CODE.fd \
      -var uefi_ovmf_vars=/usr/share/OVMF/OVMF_VARS.fd \
      -only=${BUILDER}.${CONFIGURATION} .
```

A graphical VM console is disabled by default, but you can enable it for
debugging purposes by setting the `headless` variable to `false`:

```shell
$ packer build -only=vmware-iso.msvsphere-9-vagrant-x86_64 \
               -var headless=false .
```

See the [variables.pkr.hcl](variables.pkr.hcl) file for other supported
variables.


### Building Generic Cloud images

Generic Cloud image build command:

```shell
$ packer build -only=qemu.msvsphere-9-gencloud-x86_64 .
```


### Building Vagrant boxes

VirtualBox Vagrant box build command:

```shell
$ packer build -only=virtualbox-iso.msvsphere-9-vagrant-x86_64 .
```

VMWare Vagrant box build command:

```shell
$ packer build -only=vmware-iso.msvsphere-9-vagrant-x86_64 .
```

## Debugging image builds

Use `PACKER_LOG=1` environment variable definition to get extra debug output
from Packer:

```shell
$ PACKER_LOG=1 packer build ...
```

other Packer debugging techniques are described in the Packer
[documentation](https://developer.hashicorp.com/packer/docs/debugging).

Add `-vvvv` flag to the Ansible's `extra_arguments` block in a Packer config
in order to get verbose output from Ansible:

```hcl
build {
  provisioner "ansible" {
    ...
    extra_arguments = [..., "-vvvv"]
  }
}
```

Additionally, you can connect to Packer's VNC session using a VNC client.
For TigerVNC you will need to enable the following settings:

* Input -> View only (ignore mouse and keyboard)
* Misc -> Shared (don't disconnect other viewers)

By default Packer is running a VNC server on a random TCP port in the
5900:6000 range. But for remote build environments it might be useful
to use a specific port so that you can configure a firewall easily:

```shell
$ packer build ... -var vnc_bind_address=0.0.0.0 -var vnc_port_min=5900 \
      -var vnc_port_max=5900 .
```

## License

Licensed under the MIT license, see the [LICENSE](LICENSE) file for details.