如何在ansible中使用任务前模块来验证输入参数?
在Ansible中运行我的主要剧本之前,我想验证一些东西。例如,下面的命令从用户那里获取2个输入参数,所以我想在执行主要任务之前验证它们如何在ansible中使用任务前模块来验证输入参数?,ansible,ansible-inventory,Ansible,Ansible Inventory,在Ansible中运行我的主要剧本之前,我想验证一些东西。例如,下面的命令从用户那里获取2个输入参数,所以我想在执行主要任务之前验证它们 ansible playbook-i my inventory my-main.yml--tags=repoodownload-e release\u version=5.0.0-07-e target\u env=dev/prod/prepod 在上述情况下,release_version不应为空,target_env必须是这些类型的值- 5.0.0.34
ansible playbook-i my inventory my-main.yml--tags=repoodownload-e release\u version=5.0.0-07-e target\u env=dev/prod/prepod
在上述情况下,release_version不应为空,target_env必须是这些类型的值-
5.0.0.34
我想向用户显示一条关于错误的消息。我如何做到这一点
非常感谢您的帮助。如果您确实需要用户提供变量,我将首先使用,以便在用户忘记将变量作为额外变量提供时以交互方式询问变量值。这也是一个很好的内联文档 然后可以使用
pre_tasks
以交互方式或作为额外变量验证提供的输入。对于验证,我通常使用。这里的要点是使用run\u 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
如果您绝对需要用户提供变量,我将首先使用,以便在用户忘记将变量作为额外变量提供时,以交互方式询问变量值。这也是一个很好的内联文档 然后可以使用
pre_tasks
以交互方式或作为额外变量验证提供的输入。对于验证,我通常使用。这里的要点是使用run\u 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
谢谢你的回复。这是一个很好的方法,但是如果我不想在提示期间从用户那里得到任何输入,该怎么办呢。他只会运行命令,应该就是这样。不要再努力了。有没有一种方法可以验证命令行参数?我已经使用了上面的预任务代码来验证我的输入变量,并删除了var_提示,一切正常。一如既往地感谢您的帮助:)正如我在回复中所解释的,只有在用户没有在命令行上提供额外的vars(或任何其他方式)时,使用vars_提示符才会询问一些问题。因此,您可以留下提示(以防他忘记),并继续使用您的剧本,就像以前一样,使用额外的变量(不会触发提示)。感谢您的回复。这是一个很好的方法,但是如果我不想在提示期间从用户那里得到任何输入,该怎么办呢。他只会运行命令,应该就是这样。不要再努力了。有没有一种方法可以验证命令行参数?我已经使用了上面的预任务代码来验证我的输入变量,并删除了var_提示,一切正常。一如既往地感谢您的帮助:)正如我在回复中所解释的,只有在用户没有在命令行上提供额外的vars(或任何其他方式)时,使用vars_提示符才会询问一些问题。因此,您可以保留提示(以防他忘记),并继续使用您的剧本,就像以前一样,使用额外的变量(不会触发提示)。