web-dev-qa-db-ja.com

特定の条件が失敗した場合、残りのタスクの実行を中止します

特定の条件が失敗した場合、残りのタスクの実行を中止したい。適切なエラーメッセージを表示します。

したがって、残りのタスクをスキップする代わりに、エラーメッセージを表示して、ansible Playbookの実行を停止します。

私がコマンドの下で実行しているとしましょう

$ ansible-playbook playbook.yml -e "param1=value1 param2=value"

私のプレイブックは次のように見えます:

playbook.yml:-

---
    - hosts: local
      user: roop
      gather_facts: no

      vars: {param1: "", param2: ""}

      tasks:

        #check whether param1 defined
        - name: 'Check for valid param1'
          Shell: echo {{ param1 }}
          register: isValidParam1
          when: param1 !=""

        #check if param1 is null or invalid  
        - name: 'check if param1 is null or invalid' 
          debug: msg="Please enter correct param1"
          when: param1 == ""

        #check whether param2 defined
        - name: 'Check for valid param2'
          Shell: echo {{ param2 }}
          register: isValidParam2
          when: param2 != ""

        #check if param2 is null or invalid  
        - name: 'check if param2 is null or invalid' 
          debug: msg="Please enter correct param2"
          when: param2 == ""  


        #check params is valid and defined
        - name: 'Check for valid params'
          Shell: echo "param1={{ param1 }} param2={{ param2 }}
          register: validParams
          when: isValidParam1 is defined and isValidParam2 is defined

        #check if params are invalid then abort below all tasks.  
        - name: 'check if validParams is null or invalid' 
          debug: msg="Please enter correct Params"
          when: validParams is not defined    


         # based on validParams, and different value of param1 more than 
          10 task executing.

最後のタスクのコメントで述べたように。 validParamsparam1の異なる値に基づいて10以上のタスクを実行しています。 validParamsが未定義の場合、ここで必要なものはすべての実行を中止し、エラーメッセージを表示します。

これを行うための効率的な方法はありますか?提案してください。

34
Roopendra

Assert http://docs.ansible.com/assert_module.html またはfail http://docs.ansible.com/fail_module.html を使用できます

このようなものと一緒に行きます

        #check if params are invalid then abort below all tasks.  
        - name: 'check parm is null or invalid' 
          fail: msg="Please enter correct Params"
          when: "param1 is not defined or param2 is not defined " ## whatever condition you want
54
DomaNitro

Ansible 2.2+にはメタモジュールがあります: http://docs.ansible.com/ansible/latest/meta_module.html

そう

meta:end_play

失敗していないステータスでプレイブックを停止します

18
Florian Braun

Ansible> = 2.0には、タスクを論理的にグループ化できる ブロック機能 があります。これにより、タスクのグループにwhenを適用できます。

これとfailまたはassertモジュールの主な違いは、タスクは失敗としてマークされていません。スキップされただけです。これが良いかどうかは、ユースケースによって異なります。たとえば、後でエラーを解析するログに書き込むタスクがいくつかあります。 「実際の」障害状態のみがログに記録される場合、これを行うのは簡単です。

サンプルコード:

- block:

    # task 1

    # task 2

    # task 3

  when: "param1 is defined or param2 is defined"

# otherwise output a message
- block:

    debug: msg="Missing params"

  when: "param1 is not defined or param2 is not defined"
6
hillsy