Skip to main content

Overview

This guide walks through the full setup of Orka Engine Orchestration for VDI deployments. It covers network preparation, controller and host configuration, Orka Engine installation, VM deployment, and the Semaphore web interface. There are three roles in this setup:
  • Controller: the machine running Ansible and the orchestration playbooks. This is typically a dedicated VM.
  • Hosts: physical Mac hardware running Orka Engine and the macOS VMs.
  • VMs: macOS virtual machines provisioned and managed through the orchestration library.
Note: Total deployment time can depend on node count, but budget 30-60 minutes to set up your initial controller and host.

Prerequisites

  • An Ansible controller (macOS or Linux, minimum: 2 vCPU, 4 GB RAM, 20 GB storage; recommended: 4 vCPU, 8 GB RAM, 50 GB storage)
  • One or more physical Apple silicon based Mac hosts with macOS Sonoma, Sequoia, or Tahoe Minimum specifications per Orka host:
    • Apple silicon processor (any M-series chip)
    • 8GB RAM
    • 512GB storage
    • 1GB Ethernet
    • macOS 13 (Ventura) or later
  • Recommended specifications per Orka host:
    • M2 Pro, M4 Pro, or higher
    • 16GB+ RAM (32GB+ recommended for high-density deployments)
    • 1TB+ storage
    • 10GB Ethernet
    • macOS 14 (Sonoma), 15 (Sequoia), or 26 (Tahoe)
An Orka Engine license key and installer URL (contact your MacStadium account representative) An administrator account on each machine Network connectivity between the controller and all Mac hosts Note: Orka 3.5.0 or later is required for bridged networking support. This guide assumes that the controller is being deployed on a dedicated macOS device.

Network Configuration

Static IP Assignment

Assign a static IP address to each Mac host before installing Orka Engine. Either configure the IP manually or use a DHCP reservation. To configure manually:
  1. Open System Settings then Network, then select your interface (Ethernet or Wi-Fi).
  2. Set IP Address, Subnet Mask, Router, and DNS Servers from your management VLAN.
  3. Apply settings and verify connectivity.
To use a DHCP reservation:
  1. Note the MAC address of each host from System Settings then Network then Details then Hardware.
  2. Configure your DHCP server to assign a fixed IP to each MAC address.
  3. Verify the host receives the reserved IP.
Document the following for each host before proceeding. This information populates the Ansible inventory file.

Firewall Requirements (Citrix DaaS)

If deploying MacStadium VDI with Citrix DaaS, ensure the following traffic is permitted: Outbound from VMs (TCP 443):
  • [customer_ID].xendesktop.net - Citrix DaaS controller
  • *.*.nssvc.net - Citrix Gateway Service
  • *.citrixworkspacesapi.net - Gateway connectivity checks
  • On-premises delivery controller FQDNs (for CVAD deployments)
  • If Citrix Rendezvous is enabled, also allow outbound TCP/UDP 443 to ..nssvc.net.
Inbound to VMs:
  • TCP/UDP 1494 and 2598 for HDX sessions

1.  Controller Setup

Run the steps in this section on the designated Ansible controller machine.

1.1  Set the Hostname

Run on: Controller Set a consistent hostname before configuring anything else. This ensures that your VDI tools are able to label the host devices accordingly. Replace example-controller with your chosen name.

1.2  Install Homebrew

Run on: Controller

1.3  Install Ansible

Run on: Controller Modern versions of macOS protect against installing python packages system-wide. Install Ansible through pipx in a virtual environment so it is isolated from system Python packages.
Note: Optionally install sshpass if you prefer password-based authentication instead of key exchange: brew tap esolitos/ipa && brew install esolitos/ipa/sshpass

2.  Host Setup

Run the steps in this section on each physical Mac host. Repeat for every host in your fleet.

2.1  Set the Hostname

Run on: Host(s) Replace example-host0 with the appropriate hostname for each machine. Use a short name (no dots) for HostName.

2.2  Install Homebrew

Run on: Host(s)

2.3  Check Python

Run on: Host(s) Python 3 is required for Ansible to manage the host. It will be installed in macOS by default, but running the below command will ensure it is present and configured.

3.  Configure SSH Access

Run the steps in this section on the controller. Ansible uses SSH key authentication to connect to each host.

3.1  Generate an SSH Key

Run on: Controller If you do not already have an SSH key, generate one. Accept the default file path or specify your own.

3.2  Copy the Key to Each Host

Run on: Controller Run ssh-copy-id once per host, substituting the correct IP address each time.
Verify the connection works before moving on:

4.  Configure the Orchestration Library

Run all steps in this section on the controller.

4.1  Clone the Repository

Run on: Controller The orchestration library lives at ~/orka-automation/orka-engine-orchestration on the controller.

4.2  Create the Inventory File

Run on: Controller The inventory file tells Ansible which hosts to manage. Create it at ./inventory inside the repository.
Create the inventory file
Inventory file contents - add the IP address of each host:

4.3  Configure Group Variables

Run on: Controller Group variables apply settings to all hosts in your inventory. Open the file created in the previous step:
File contents:
Variable reference:

5.  Install Orka Engine

This playbook downloads and installs the Orka Engine package on every host in your inventory. It applies the license key and starts the Orka Engine service automatically. Run on: Controller
Note: Obtain your license key and installer URL from your MacStadium account representative.

5.1  Verify the Installation

Run on: Controller

5.2  Force Reinstall or Upgrade

Run on: Controller Add the install_engine_force flag to reinstall or upgrade to a newer version:

6.  Deploy and Manage VMs

All playbook commands are run from the controller inside ~/orka-automation/orka-engine-orchestration.

6.1  Deploy VMs

Run on: Controller Deploy a VM by name. Run once per VM to deploy multiple.
For VDI workloads, use bridged networking so VMs receive IP addresses directly on your LAN. Specify the network interface (typically en0 for Ethernet):
Run this command once for each additional VM, using a unique vm_name each time. Note: When network_interface is not specified, VMs deploy in NAT mode. Bridged mode is recommended for VDI because VMs are directly reachable by Citrix Cloud and end users without port forwarding. To preview what will be deployed without making any changes, add --tags plan:

6.2  List VMs

Run on: Controller

6.3  Manage Individual VMs

Run on: Controller Start, stop, or delete a specific VM by name. Valid values for desired_state are running, stopped, and absent.

6.4  Delete VMs

Run on: Controller Delete a VM by name.
Run this command once for each VM to remove.

6.5  Pull Images

Run on: Controller Pre-pull an image to all hosts so it is ready for fast deployment:

7.  Semaphore Web UI

Semaphore provides a browser-based interface for running orchestration playbooks. It is the primary way IT administrators interact with MacStadium VDI. The CLI is available for troubleshooting and advanced or custom workflows. All task templates, inventory, and repository configuration are set up automatically on first launch.

7.1  Install Prerequisites

Run on: Controller Docker and uv are required to run Semaphore. Install Docker through Homebrew:
Note: Docker Desktop is an alternative if you prefer a GUI installer. Either option works. Install uv (used to run the Semaphore configuration script):

7.2  Configure the Environment

Run on: Controller Copy the example environment file and generate an encryption key:
Generate a 32-byte base64 key
Open semaphore/.env and paste the generated key as the value for SEMAPHORE_ACCESS_KEY_ENCRYPTION:
Set this value to the key generated above:
Also set your admin username and password in the same file before starting Semaphore.

7.3  Start Semaphore

Run on: Controller
Semaphore is available at http://localhost:3000. Log in with the admin credentials you set in the .env file.

7.4  Configure SSH Credentials

You can configure SSH credentials either via the setup script or manually through the Semaphore UI. Option A: Setup script (recommended) uv is required to run this script. It is a lightweight Python package manager that executes the configuration script without requiring a virtual environment. It handles SSH key setup and optionally sets default VM credentials and OCI registry credentials in one step.
Run uv run ./semaphore/configure_semaphore.py --help to see additional parameters, including default VM username/password and OCI registry credentials. Option B: Manual (UI) After logging in, navigate to Key Store and edit the Mac Hosts SSH key. Replace the placeholder credentials with the actual SSH username and private key (or password) for your Mac hosts.

7.5  Available Task Templates

The following templates are pre-configured and ready to use in the Orka Engine Orchestration project. Templates are organized by category. Each template prompts for required inputs when you click Run.

7.6  Stop Semaphore

Stop containers but keep data
Stop and remove all data (database, task history)

8.  Image Management

8.1  Using MacStadium Public Images

MacStadium maintains public base images through GitHub Container Registry. No authentication is required. Reference them by OCI path: ghcr.io/macstadium/orka-images/[os-version]:latest Available images include Tahoe, Sequoia, Ventura, and Sonoma. Use the image name matching your target macOS version.

8.2  Building a Custom Golden Image

For VDI deployments, build a golden image with Citrix VDA and your organization’s software pre-installed. The create_image.yml playbook deploys a temporary VM from a base image, runs your customization scripts, pushes the resulting image to your registry, then cleans up the VM. Add your customization scripts to the /scripts folder in the repository, then run: Run on: Controller

8.3  Distributing Images to Hosts

Pre-pull images to all hosts before deploying VMs to avoid pull delays at deployment time: Run on: Controller

8.4  Private Registry Naming

If using a self-hosted registry (Harbor, Docker Registry, JFrog Artifactory), use a consistent naming convention: registry.example.com/orka/citrix-vda/sequoia-finance:v1.0 registry.example.com/orka/citrix-vda/sequoia-engineering:v2.1 registry.example.com/orka/citrix-vda/tahoe-marketing:latest Note: Store registry credentials in Ansible Vault, never in plain text. Exclude vault files from Git using .gitignore.

9.  Repository and Version Control

Fork the orka-engine-orchestration repository on GitHub so you can customize it and track changes over time. •    Add a .gitignore to exclude SSH keys, vault files, and other secrets. •    Never commit passwords, tokens, or private keys. •    Tag releases used in production. •    Use separate branches for staging and production changes. •    Document your inventory structure and playbook customizations in the repository README.

Support Resources

Note: The following remote host CLI commands are for advanced troubleshooting and diagnostics. It is recommended to use the Ansible playbooks or Semaphore UI when available.