feat(ansible): structured playbook-variable fields on the schedule form
The Ansible Schedules form only offered a free-form extra-vars textarea,
unlike the browse/host run forms which auto-populate a field per declared
playbook variable (vars:/vars_prompt:) plus the playbook description. Wire
the schedule form to the same shared `_playbook_vars.html` partial:
- Playbook <select> now loads /ansible/playbook-vars?schedule=1 on change
into a #sch-playbook-vars container (mirrors the host detail form).
- Edit mode pre-renders the saved playbook's variables server-side with
their stored values; the extra-vars textarea keeps only leftover
(non-declared) vars.
- Partial gains optional `values` (prefill) and `schedule` flags. In the
schedule context secret vars render disabled ("secrets can't be
scheduled") since they're dropped downstream, and the destructive-confirm
gate is shown but not required.
Backend already parsed var__* fields for schedules, so this is the
front-end/partial parity fix.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -172,6 +172,8 @@ async def playbook_vars():
|
||||
(vars/vars_prompt), loaded when a playbook is chosen from a dropdown."""
|
||||
source_name = (request.args.get("source_name", "") or "").strip()
|
||||
playbook_path = (request.args.get("playbook_path", "") or "").strip()
|
||||
# Schedule form: schedules can't prompt, so secret vars render disabled.
|
||||
schedule = (request.args.get("schedule", "") or "").strip() == "1"
|
||||
source = next((s for s in _get_sources() if s["name"] == source_name), None)
|
||||
variables: list = []
|
||||
meta: dict = {"description": "", "category": "", "confirm": False}
|
||||
@@ -182,7 +184,8 @@ async def playbook_vars():
|
||||
meta = src_module.discover_playbook_meta(contents)
|
||||
return await render_template(
|
||||
"ansible/_playbook_vars.html", variables=variables,
|
||||
description=meta["description"], category=meta["category"], confirm=meta["confirm"])
|
||||
description=meta["description"], category=meta["category"],
|
||||
confirm=meta["confirm"], schedule=schedule)
|
||||
|
||||
|
||||
@ansible_bp.get("/run-form/<source_name>/<path:playbook_path>")
|
||||
@@ -383,11 +386,25 @@ async def schedules():
|
||||
if editing_id and s.id == editing_id:
|
||||
editing = s
|
||||
|
||||
# Edit mode: pre-render the selected playbook's declared variables so their
|
||||
# saved values show (fresh loads fetch these via HTMX from /playbook-vars).
|
||||
edit_variables: list = []
|
||||
edit_meta: dict = {"description": "", "category": "", "confirm": False}
|
||||
if editing:
|
||||
src = next((s for s in _get_sources() if s["name"] == editing.source_name), None)
|
||||
if src:
|
||||
contents = src_module.read_playbook(src["path"], editing.playbook_path)
|
||||
if contents is not None:
|
||||
edit_variables = src_module.discover_playbook_variables(contents)
|
||||
edit_meta = src_module.discover_playbook_meta(contents)
|
||||
|
||||
return await render_template(
|
||||
"ansible/schedules.html",
|
||||
rows=rows, groups=groups, targets=targets,
|
||||
source_data=source_data, all_playbooks=all_playbooks,
|
||||
editing=editing, interval_presets=INTERVAL_PRESETS,
|
||||
edit_variables=edit_variables, edit_description=edit_meta["description"],
|
||||
edit_category=edit_meta["category"], edit_confirm=edit_meta["confirm"],
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user