Как использовать модуль предварительной задачи в ansible для проверки входных параметров? - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу проверить несколько вещей, прежде чем запустить основную игру в 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

Я хочу показать пользователю сообщение о том, что не так. Как мне этого добиться?

Любая помощь приветствуется.

1 Ответ

1 голос
/ 01 апреля 2020

Если вам абсолютно необходимо, чтобы пользователь предоставил переменные, я бы в первую очередь использовал 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
...