A small web dashboard for running Ansible playbooks from a git repo, with manual or scheduled git sync.
- Lists playbooks from the synced repo with inline tag (
--tags) and host (--limit) selection; live colorized log streaming, cancel, and a configurable run timeout (default 60 min) - Live per-task progress and a structured Play Recap on completion
- View playbook/inventory YAML, syntax highlighted (read-only)
- Per-playbook cron schedules, independent of the git sync schedule
- Run notifications via Pushover and/or ntfy — every run or failures only
- "Sync from Git" installs collections from the repo's
requirements.yaml; Sync Logs tab shows full output - Settings backup/restore as YAML
- SQLite-backed login (first run creates the admin account), or
ULMO_DISABLE_AUTH=trueto skip it
curl -O https://raw.githubusercontent.com/ccmpbll/ulmo/main/docker-compose.yml
docker compose up -dOpen http://localhost:8000, create the first user, then in Settings set the git repo URL, branch, and (optionally) sync schedule. Click Sync from Git to do the first clone.
Expected at the root of your synced repo — ansible.cfg (required there, no override),
inventory.yaml, requirements.yaml. All three paths are configurable in Settings if named or
placed differently; playbooks themselves live in a subdirectory (playbooks/ by default):
.
├── ansible.cfg
├── inventory.yaml
├── requirements.yaml
└── playbooks/
└── site.yaml
Settings → SSH Key — paste the private key(s) used to connect to managed hosts. Symlinked
into the container at /home/ansible/.ssh and /root/.ssh to match the common
ansible_ssh_private_key_file: /home/ansible/.ssh/ansible-ed25519 inventory convention, so no
inventory changes are needed. Set ULMO_SSH_LINK_HOMES if yours points elsewhere. Keys must be
unencrypted. A private git remote needing its own key can mount one directly in
docker-compose.yml.
ULMO_DISABLE_AUTH=true— skip login entirely; only if ulmo already sits behind your own access control (reverse proxy, VPN)ULMO_SECRET_KEY— pin the session-signing key; otherwise one is generated and persisted to./data/secret_keyautomaticallyULMO_SSH_LINK_HOMES— comma-separated home dirs to symlink SSH keys into, if not/home/ansibleor/root
Everything lives under ./data (db, synced repo, SSH keys, run logs, installed collections) —
back that whole directory up. Settings backup/restore covers everything except SSH keys and user
accounts.
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
ULMO_DATA_DIR=./data uvicorn app.main:app --reload