From 8d772ea725dca516cdbec4021bbe0c855977f077 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 20 Sep 2025 12:35:43 +0530 Subject: [PATCH 1/5] vars_prompt: add choices support for input validation Add support for 'choices' key in vars_prompt to restrict user input to predefined options. When choices are specified: - Interactive prompts validate user input against allowed choices - Values from --extra-vars are also validated - Invalid values raise ValueError with clear error message This enhancement improves playbook usability by preventing invalid input and providing clear feedback to users. --- .../fragments/vars_prompt_choices_support.yml | 3 ++ lib/ansible/executor/playbook_executor.py | 49 ++++++++++++++++--- lib/ansible/playbook/play.py | 2 +- 3 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 changelogs/fragments/vars_prompt_choices_support.yml diff --git a/changelogs/fragments/vars_prompt_choices_support.yml b/changelogs/fragments/vars_prompt_choices_support.yml new file mode 100644 index 00000000000..48c173ce277 --- /dev/null +++ b/changelogs/fragments/vars_prompt_choices_support.yml @@ -0,0 +1,3 @@ +--- +minor_changes: + - vars_prompt now supports a `choices` key for input validation. If choices are defined, users must pick one of the provided options. Values supplied via `--extra-vars` are also validated against the choices list. diff --git a/lib/ansible/executor/playbook_executor.py b/lib/ansible/executor/playbook_executor.py index 9bd7317615c..9c50dcc8f77 100644 --- a/lib/ansible/executor/playbook_executor.py +++ b/lib/ansible/executor/playbook_executor.py @@ -139,13 +139,48 @@ class PlaybookExecutor: salt = var.get("salt", None) unsafe = boolean(var.get("unsafe", False)) - if vname not in self._variable_manager.extra_vars: - if self._tqm: - self._tqm.send_callback('v2_playbook_on_vars_prompt', vname, private, prompt, encrypt, confirm, salt_size, salt, - default, unsafe) - play.vars[vname] = display.do_var_prompt(vname, private, prompt, encrypt, confirm, salt_size, salt, default, unsafe) - else: # we are either in --list-