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

Sha*_*wal 2 ansible ansible-inventory

在 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

我想向用户显示一条有关错误的消息。我如何实现它?

任何帮助表示赞赏。

Zei*_*tor 6

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

然后,您可以使用pre_tasks交互方式或作为额外变量来验证提供的输入。为了进行验证,我通常使用failmodule。这里的要点是使用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:
        msg: "Deploying version {{ release_version }} for environment {{ target_env }} on {{ inventory_hostname }}"
Run Code Online (Sandbox Code Playgroud)

以下是启动剧本的一些示例:

##########################
# Fully interactive runs #
##########################

$ ansible-playbook -i localhost, playbook.yml 
What is the release version ? [w.x.y-z]: wrong
What is the target environment ? [dev, preprod, prod]: prod

PLAY [Prompt and validation demo] ************************************

TASK [Make sure version is ok] ***************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Release version is not formatted correctly. Please make sure it is of the form w.x.y-zz"}

NO MORE HOSTS LEFT ***************************************************

PLAY RECAP **********************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0


$ ansible-playbook -i localhost, playbook.yml 
What is the release version ? [w.x.y-z]: 1.2.3-44
What is the target environment ? [dev, preprod, prod]: dev

PLAY [Prompt and validation demo] ************************************

TASK [Make sure version is ok] ***************************************
skipping: [localhost]

TASK [Make sure target_env is allowed] *******************************
skipping: [localhost]

TASK [Dummy task just to have a complete playbook for the example] ***
ok: [localhost] => {
    "msg": "Deploying version 1.2.3-44 for environment dev on localhost"
}

PLAY RECAP ***********************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0


###############
# Hybrid run #
###############

$ ansible-playbook -i localhost, playbook.yml -e target_env=prod
What is the release version ? [w.x.y-z]: 1.2.3-44

PLAY [Prompt and validation demo] ************************************

TASK [Make sure version is ok] ***************************************
skipping: [localhost]

TASK [Make sure target_env is allowed] *******************************
skipping: [localhost]

TASK [Dummy task just to have a complete playbook for the example] ***
ok: [localhost] => {
    "msg": "Deploying version 1.2.3-44 for environment prod on localhost"
}

PLAY RECAP ***********************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0


###################
# Fully automated #
###################

$ ansible-playbook -i localhost, playbook.yml -e target_env=prod -e release_version=1.2.3-44

PLAY [Prompt and validation demo] ************************************

TASK [Make sure version is ok] ***************************************
skipping: [localhost]

TASK [Make sure target_env is allowed] *******************************
skipping: [localhost]

TASK [Dummy task just to have a complete playbook for the example] ***
ok: [localhost] => {
    "msg": "Deploying version 1.2.3-44 for environment prod on localhost"
}

PLAY RECAP ***********************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
Run Code Online (Sandbox Code Playgroud)