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

How do i use pre task module in ansible to validate input parameters?

在我 运行 我在 Ansible 中的主要表现之前,我想验证一些事情。例如下面的命令从用户那里获取 2 个输入参数,所以我想在执行主要任务之前验证它们。

ansible-playbook -i my-inventory my-main.yml --tags=repodownload -e release_version=5.0.0-07 -e target_env=dev/prod/preprod

在上述情况下,release_version 不应为空,target_env 必须是这些类型的值 - 5.0.0.34

我想向用户显示有关问题的消息。我如何实现它?

感谢任何帮助。

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

然后您可以使用 pre_tasks 以交互方式或作为额外变量验证提供的输入。对于验证,我通常使用 fail module。这里的重点是使用 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