{"id":51520646,"url":"https://github.com/cvquesty/openvox-ovbuilder","last_synced_at":"2026-07-08T15:30:21.859Z","repository":{"id":367141191,"uuid":"1279408868","full_name":"cvquesty/openvox-ovbuilder","owner":"cvquesty","description":"🦊 ovbuilder — OpenVox-native CLI for building VMware VMs from ISO images and registering them with OpenVox (follows ovox CLI design language)","archived":false,"fork":false,"pushed_at":"2026-06-24T18:23:19.000Z","size":75,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"staging","last_synced_at":"2026-06-24T19:14:27.746Z","etag":null,"topics":["cli","devops","openvox","provisioning","puppet","terraform","vmware"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cvquesty.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-24T16:56:46.000Z","updated_at":"2026-06-24T18:23:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cvquesty/openvox-ovbuilder","commit_stats":null,"previous_names":["cvquesty/openvox-ovbuilder"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/cvquesty/openvox-ovbuilder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvquesty%2Fopenvox-ovbuilder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvquesty%2Fopenvox-ovbuilder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvquesty%2Fopenvox-ovbuilder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvquesty%2Fopenvox-ovbuilder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cvquesty","download_url":"https://codeload.github.com/cvquesty/openvox-ovbuilder/tar.gz/refs/heads/staging","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvquesty%2Fopenvox-ovbuilder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35270196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-08T02:00:06.796Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","devops","openvox","provisioning","puppet","terraform","vmware"],"created_at":"2026-07-08T15:30:20.965Z","updated_at":"2026-07-08T15:30:21.854Z","avatar_url":"https://github.com/cvquesty.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🦊 ovbuilder\n\n**The OpenVox-native CLI for building VMware VMs from ISO images — fast, repeatable, and a little bit magical.**\n\n[![Version](https://img.shields.io/badge/version-0.2.0--dev.3-orange?style=for-the-badge)](https://github.com/cvquesty/openvox-ovbuilder/releases)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=for-the-badge)](LICENSE)\n[![Python](https://img.shields.io/badge/python-3.9%2B-3776AB?style=for-the-badge\u0026logo=python\u0026logoColor=white)](https://python.org)\n[![Typer](https://img.shields.io/badge/Typer-0.12+-blue?style=for-the-badge\u0026logo=python\u0026logoColor=white)](https://typer.tiangolo.com)\n[![Rich](https://img.shields.io/badge/Rich-13+-brightgreen?style=for-the-badge\u0026logo=python\u0026logoColor=white)](https://rich.readthedocs.io)\n[![Terraform](https://img.shields.io/badge/Terraform-1.5%2B-7B42BC?style=for-the-badge\u0026logo=terraform\u0026logoColor=white)](https://terraform.io)\n[![Paramiko](https://img.shields.io/badge/Paramiko-3%2B-orange?style=for-the-badge\u0026logo=python\u0026logoColor=white)](https://paramiko.org)\n\n[![GitHub Stars](https://img.shields.io/github/stars/cvquesty/openvox-ovbuilder?style=flat-square)](https://github.com/cvquesty/openvox-ovbuilder/stargazers)\n[![GitHub Issues](https://img.shields.io/github/issues/cvquesty/openvox-ovbuilder?style=flat-square)](https://github.com/cvquesty/openvox-ovbuilder/issues)\n[![Last Commit](https://img.shields.io/github/last-commit/cvquesty/openvox-ovbuilder?style=flat-square)](https://github.com/cvquesty/openvox-ovbuilder/commits/staging)\n\n[Quick Start](#-quick-start) · [Usage](#-usage) · [Configuration](#-configuration) · [How It Works](#-how-it-works) · [Changelog](CHANGELOG.md) · [Contributing](#-contributing)\n\n\u003c/div\u003e\n\n---\n\nA delightful, standards-based command-line tool that turns \"I need a new OpenVox node\" into a few prompts and a finished, registered VM.\n\nThink of it as the friendly older sibling to raw `terraform apply` — it handles the ISO dance, the vSphere ceremony, the \"wait, did I set the IP right?\" moment, and then reaches inside the fresh VM to run the official OpenVox agent bootstrap so your new box phones home immediately.\n\n## 🎯 What is ovbuilder?\n\nIf you've ever found yourself:\n\n- Hunting for the right ISO path in a datastore\n- Copy-pasting the same Terraform variables for the 47th time\n- SSHing in after the OS install just to run that one curl | sudo bash command\n- Forgetting whether you used thin provisioning this time\n\n...then ovbuilder is for you.\n\nIt follows the same modern, noun-verb, operator-first philosophy as the `ovox` CLI. Everything is intentional, discoverable, and a little bit enjoyable.\n\n## 📦 Current Components \u0026 Versions\n\nThese are the moving parts that make up ovbuilder today (verified in a live RHEL 9 + VMware environment):\n\n| Component              | Version     | Notes |\n|------------------------|-------------|-------|\n| **ovbuilder CLI**      | `0.1.0`     | Typer + Rich Python package. The friendly face. |\n| **Terraform Module**   | 1.x (bundled) | VMware vSphere ISO boot + thin disks + EFI. Lives in `terraform/modules/vm/`. |\n| **Python Runtime**     | 3.9+        | Typer ≥0.12, Rich ≥13, Paramiko ≥3 for SSH post-steps. |\n| **Post-Install**       | —           | Hostname + static IP (nmcli/netplan best-effort) + official OpenVox `install.bash`. |\n| **OpenVox Target**     | 8.x+        | Registers via the standard `curl -k --noproxy ... | sudo bash` flow. |\n\nThe bundled Terraform module always uses **thin provisioning** for disks and disables guest waiters (because a fresh ISO installer isn't a \"ready\" guest yet).\n\n## 🖼️ The ovbuilder Experience (in pictures and emojis)\n\n**The happy path looks like this:**\n\n```\n🦊 ovbuilder build\n    ↓ (interactive OS selector + prompts)\n    ↓ (collects vSphere creds like a pro)\n    ↓ (fires Terraform with correct vars)\n🛠️  VM created + ISO attached + powered on\n    ↓ (you finish the OS install in the vSphere console)\n🔐  ovbuilder SSHes in\n📡  Configures hostname + IP\n📦  Runs the OpenVox agent installer\n✅  Node appears in your fleet, ready for classification\n```\n\n## 🚀 Quick Start\n\n```bash\n# Clone the repository\ngit clone https://github.com/cvquesty/openvox-ovbuilder.git\ncd openvox-ovbuilder\n\n# Run the installer (recommended).\n# Use sudo -H on macOS to avoid HOME/permission issues.\nsudo -H ./install.sh\n\n# Run the builder — it should just work\novbuilder build\n```\n\n### After Installation\n\nYou should be able to run:\n\n```bash\novbuilder build\n```\n\n**From your ls output (this is the exact problem):**\n\nThe symlink `/usr/local/bin/ovbuilder` has `lrwxr-x---` (0750) — other users have no permissions on the link.\n\n`pyvenv.cfg` has `-rw-r-----` (0640) — no read for your normal user.\n\nThe dirs are 755 and the wrapper is 755 (good).\n\n**Immediate fix for your current state:**\n\n```bash\nsudo chmod -h 755 /usr/local/bin/ovbuilder\nsudo chmod 644 /opt/ovbuilder/venv/pyvenv.cfg\nsudo chmod 755 /opt/ovbuilder/venv /opt/ovbuilder/venv/bin\n\nexport PATH=\"/usr/local/bin:$HOME/.local/bin:$PATH\"\nhash -r\novbuilder build\n```\n\n**If your source checkout still has the bad `ovbuilder.egg-info` (0750 root:staff):**\n\n```bash\nsudo chown -R $(id -un):staff .\nsudo chmod -R u+rwX .\n```\n\n**Pull the latest script and re-install:**\n\n```bash\ngit fetch origin\ngit reset --hard origin/staging\nsudo -H ./install.sh\n```\n\nThe script now ends with a block that always does the `chmod +x || sudo chmod +x` (with -h for the link) and the a+rX for the venv.\n\nIt will print the exact location and the commands to run in this shell.\n\nThe \"which not found\" is zsh's hash cache after the permission denied — `hash -r` clears it.\n\nRun:\n\n```bash\nexport PATH=\"/usr/local/bin:$HOME/.local/bin:$PATH\"\nhash -r\novbuilder build\n```\n\nFor it to persist, add the export line above to your `~/.zshrc` (default on modern macOS) and restart your terminal, or run `source ~/.zshrc`.\n\n**Critical fix in the current installer:** For sudo/system installs we now do a *regular* (non-editable) `pip install .` instead of `-e .`.\n\nThis prevents pip from creating any files in your source checkout as root (e.g. the `ovbuilder.egg-info` directory with 0750 root:staff permissions you observed). Root-owned files in the source tree prevent your normal user from descending into directories, causing \"permission denied\" or \"not found\" even for the installed command.\n\nEditable mode is only used for user-mode (`--user`) installs.\n\nThe installer always ends with aggressive permission fixes (`chmod +x || sudo chmod +x`) on the symlink and real target.\n\nIf you are still seeing the error right now, fix your source tree and re-install:\n\n```bash\ncd /path/to/your/openvox-ovbuilder-clone\nsudo chown -R $(id -un):staff .\nsudo chmod -R u+rwX .\n\nsudo -H ./install.sh\n```\n\nThen in the same shell:\n\n```bash\nexport PATH=\"/usr/local/bin:$HOME/.local/bin:$PATH\"\nhash -r\novbuilder build\n```\n\nIf permission denied persists on the command:\n\n```bash\nsudo chmod +x /usr/local/bin/ovbuilder\nsudo chmod +x /opt/ovbuilder/venv/bin/ovbuilder 2\u003e/dev/null || true\nsudo chmod +x /opt/ovbuilder/venv/bin/python* 2\u003e/dev/null || true\nhash -r\novbuilder build\n```\n\n### Manual / Development Install\n\nIf you prefer to manage the environment yourself:\n\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\nDuring the flow you'll pick an ISO, give it a name and IP, choose some sizing, watch Terraform do its thing, finish the OS install in the console, then let ovbuilder finish the registration for you.\n\nNon-interactive is also fully supported for scripts and CI:\n\n```bash\novbuilder build \\\n  --hostname openvox-web03 \\\n  --ip 10.0.42.103 \\\n  --iso isos/AlmaLinux-9.4-x86_64-dvd.iso \\\n  --cpus 4 --memory 8 --disk 120 \\\n  --yes\n```\n\n## ✨ Features You'll Actually Use\n\n- **Gorgeous interactive mode** with OS selector table and smart defaults\n- **Everything is thin provisioned** — no fat disks by accident\n- **Real post-install magic** — hostname, IP, and the OpenVox agent bootstrap over SSH\n- **Self-contained** — includes its own Terraform module + `install.sh`\n- **Beginner-friendly for non-Python users** — the installer locates a working Python 3, creates a venv, and sets up the command for you. No need to type `pip` manually.\n- **vCenter discovery** — in interactive mode, you provide vCenter login once; ovbuilder connects, discovers real datacenters/clusters/datastores/networks/ISOs from your environment, and uses them to populate friendly selection menus (no more guessing \"Main DC\" or \"VM Production\" that don't exist in your vCenter). Data is used live for that run (caching can be added later).\n- **Follows the ovox design language** — same config locations, same vibe, same \"it just feels right\" feeling\n- **College-junior friendly docs** — we explain the \"why\" without talking down to you\n\n## 📚 How It Works (the interesting bits)\n\n1. You answer a few questions (or pass flags).\n2. ovbuilder assembles the right `TF_VAR_*` values and runs `terraform apply` against the bundled module.\n3. The VM boots your chosen ISO with a sensible boot delay and the CD-ROM attached.\n4. You complete the OS install in the vSphere console (set the hostname and IP you gave ovbuilder — or let the post-step try to fix it).\n5. ovbuilder waits for SSH, connects, configures what it can, and runs the official OpenVox registration script.\n6. Your new node phones home and is ready for the ENC, Hiera, or whatever classification you use.\n\nNo more \"did I remember to run the curl command?\"\n\n## 🛠️ Configuration\n\novbuilder uses the same XDG conventions as `ovox`:\n\n- Config: `~/.config/ovbuilder/config.yaml`\n- (No tokens yet — vSphere credentials are collected interactively or via `TF_VAR_vsphere_*`)\n\nExample config:\n\n```yaml\nterraform_dir: \"\"   # leave blank to use the bundled ./terraform\nvm_datastore: vsanDatastore\niso_datastore: isos\nnetworks:\n  - \"VM Production\"\nopenvox_server: openvox.example.com\ndefault_cpus: 2\ndefault_memory_gb: 4\ndefault_disk_gb: 80\n\nknown_isos:\n  \"AlmaLinux 9.4\": \"isos/AlmaLinux-9.4-x86_64-dvd.iso\"\n  \"Ubuntu 24.04\": \"isos/ubuntu-24.04-live-server-amd64.iso\"\n```\n\nEnvironment variables win (prefixed `OVBUILDER_`).\n\n## 🔧 Requirements\n\n- Python 3.9+\n- Terraform 1.5+ (in your PATH)\n- Network access to your vCenter\n- Ability to SSH to newly built VMs (after OS install)\n- An ISO collection on a datastore that your Terraform account can see\n\n## 🤝 Contributing\n\nWe love contributions that make the \"I need a new node\" flow even smoother.\n\n- Follow the same code style as the ovox CLI (clean, tested where possible, great help text).\n- New features should have both interactive and `--yes` paths.\n- Documentation should stay enjoyable but informative (college-junior voice).\n\nSee [CHANGELOG.md](CHANGELOG.md) for release process notes.\n\n## 📜 License\n\nApache 2.0 — same as the rest of the OpenVox ecosystem.\n\n---\n\nMade with 🦊 and a healthy disrespect for repetitive manual labor.\n\n*Part of the OpenVox family of tools.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcvquesty%2Fopenvox-ovbuilder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcvquesty%2Fopenvox-ovbuilder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcvquesty%2Fopenvox-ovbuilder/lists"}