From ad726e65f32172930cac2b4b3f4ce7831cec1c78 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Wed, 17 Jun 2026 10:02:15 -0400 Subject: [PATCH] feat(ansible): dropdown playbook selection + auto-populated variable fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stop making operators type playbook paths and guess extra-var names. - Reusable infra: shared ansible/_playbook_vars.html (the discovered-variable fields) + ansible/_playbook_options.html; two HTMX endpoints — /ansible/playbook-options (a source's playbooks, optional ?selected for edit) and /ansible/playbook-vars (a playbook's vars:/vars_prompt: as fill-in fields). browse _run_form.html refactored to include the shared partial. - Host "Run a playbook against this host": source dropdown → playbook dropdown → variable fields, all chained via HTMX. Handler reuses _parse_run_params so var__/secret__ fields flow through extra_vars_map + the unpersisted secret_vars channel. - Schedules: playbook free-text+datalist → source-dependent dropdown; fixed the extra-vars edit pre-fill to read extra_vars_map (stale list key after the earlier JSON-extra-vars change). Scribe #895. Co-Authored-By: Claude Opus 4.8 (1M context) --- steward/ansible/routes.py | 29 ++++++++++++++ steward/hosts/routes.py | 26 ++++--------- .../templates/ansible/_playbook_options.html | 6 +++ steward/templates/ansible/_playbook_vars.html | 32 +++++++++++++++ steward/templates/ansible/_run_form.html | 31 +-------------- steward/templates/ansible/schedules.html | 20 ++++++---- steward/templates/hosts/detail.html | 39 +++++++++++++------ 7 files changed, 114 insertions(+), 69 deletions(-) create mode 100644 steward/templates/ansible/_playbook_options.html create mode 100644 steward/templates/ansible/_playbook_vars.html diff --git a/steward/ansible/routes.py b/steward/ansible/routes.py index ccf5fce..d88dca8 100644 --- a/steward/ansible/routes.py +++ b/steward/ansible/routes.py @@ -143,6 +143,35 @@ def _parse_run_params(form) -> tuple[dict | None, dict | None, str | None]: return (params or None), (secret_vars or None), None +@ansible_bp.get("/playbook-options") +@require_role(UserRole.operator) +async def playbook_options(): + """HTMX fragment: