## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Cloud-Init Block

The `cloud-init` block configures guest initialization via cloud-init's NoCloud datasource.

## Syntax

    cloud-init {
        hostname "myvm"
        ssh-key "~/.ssh/id_ed25519.pub"
        user-data "path/to/cloud-config.yaml"
    }

All fields are optional.

## Fields

### hostname

    hostname "myvm"

Sets the guest hostname via cloud-init metadata.

### ssh-key

    ssh-key "~/.ssh/id_ed25519.pub"

Path to an SSH public key file. The key is injected into the cloud-config's `authorized_keys` for the SSH user. Path is resolved relative to the VMFile directory.

### user-data

    user-data "cloud-config.yaml"

Path to a raw cloud-config YAML file. When this is set, vmctl passes the file contents directly as user-data without generating its own cloud-config. You are responsible for user creation and SSH setup.

Mutually exclusive with `ssh-key` in practice - if you provide raw user-data, vmctl won't inject any SSH keys.

## Auto-Generated SSH Keys

When a `cloud-init` block is present but neither `ssh-key` nor `user-data` is specified, vmctl automatically:

1. Generates a per-VM Ed25519 keypair.
2. Injects the public key into the cloud-config.
3. Stores both keys in the VM's work directory.

This is the recommended approach for most use cases.