#Concepts
Each section of the build YAML, explained one at a time. Pick whichever piece you're trying to understand.
- Sources — Every VM needs exactly one source. Pick whichever fits your situation.
- Files — files is a named registry of files. Every other surface that needs files (floppy, HTTP directory, file provisioner) references entries from this list by name.
- Provisioners — Provisioners run in order, top to bottom. If any step fails, the build fails.
- Communicators (SSH) — A communicator is the channel the build uses to talk to the running VM while provisioning it — the mechanism for uploading files and executing scripts inside the guest. After the VM boots, the build needs a way to reach in and run things; the communicator is that connection.
- Networking — Every module gets an isolated network shared by its VMs. By default, the build creates a single VPC with one subnet and internet access — that's fine for most cases. Declare network only when you need something more.
- Boot Commands — bootCommand types keystrokes into the VM's VNC console in order. Use it to drive boot loaders, ISO menus, and any pre-SSH setup.
- Cloud-init — Cloud images expect cloud-init for first-boot configuration: user creation, SSH key injection, package installs, custom commands. The build uses cloud-init to inject its own SSH key, so you must include a cloudInit block for cloud-image sources.
- Build-only Overrides — Some settings should differ between building a module and running clones of it. The build phase often needs: