Если вам абсолютно необходимо, чтобы пользователь предоставил переменные, я бы в первую очередь использовал vars_prompt
, чтобы в интерактивном режиме запрашивалось значение переменной, если пользователь забыл предоставить их в качестве дополнительных переменных. Это также делает хорошую встроенную документацию.
Затем вы можете использовать pre_tasks
для проверки предоставленного ввода, либо в интерактивном режиме, либо в качестве дополнительной переменной. Для проверки я обычно использую fail
модуль . Смысл здесь в том, чтобы использовать run_once: true
, чтобы заставить тест запускаться только один раз, даже если в вашей игре несколько хостов.
Вот пример, основанный на ваших данных. Адаптируйся под свои нужды
---
- name: Prompt and validation demo
hosts: all
gather_facts: false
vars:
_allowed_envs:
- dev
- preprod
- prod
vars_prompt:
- name: release_version
prompt: "What is the release version ? [w.x.y-z]"
private: no
- name: target_env
prompt: "What is the target environment ? [{{ _allowed_envs | join(', ') }}]"
private: no
pre_tasks:
- name: Make sure version is ok
fail:
msg: >-
Release version is not formatted correctly. Please make sure
it is of the form w.x.y-zz
when: not release_version is regex('\d*(\.\d*){2}-\d\d')
run_once: true
- name: Make sure target_env is allowed
fail:
msg: >-
Environment "{{ target_env }}" is not allowed.
Please choose a target environment in {{ _allowed_envs | join(', ') }}
when: not target_env in _allowed_envs
run_once: true
tasks:
- name: "Dummy task just to have a complete playbook for the example"
debug:
var: ansible_hostname