Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ansible中使用任务前模块来验证输入参数?_Ansible_Ansible Inventory - Fatal编程技术网

如何在ansible中使用任务前模块来验证输入参数?

如何在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中运行我的主要剧本之前,我想验证一些东西。例如,下面的命令从用户那里获取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

我想向用户显示一条关于错误的消息。我如何做到这一点


非常感谢您的帮助。

如果您确实需要用户提供变量,我将首先使用,以便在用户忘记将变量作为额外变量提供时以交互方式询问变量值。这也是一个很好的内联文档

然后可以使用
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_提示符才会询问一些问题。因此,您可以保留提示(以防他忘记),并继续使用您的剧本,就像以前一样,使用额外的变量(不会触发提示)。