2017-09-22 15 views
0

SQLスクリプトのリストを実行するタスクがあります。シーケンス内のスクリプトのANYの実行中にエラーが発生した場合、タスクは実行を停止する必要があります。ルーピングタスクの実行中にタスクエラーが発生する可能性があります。

'ERROR'がstdoutにあるかどうかをチェックするループの現在の反復に対するレジスタのstdoutを確認する方法がありますか?

- name: Build and run SQLPlus commands 
    shell: 'echo @{{ item }} | {{ sqlplus }} {{ db_user }}/{{ db_pass }}@{{ environment }}' 
    register: sh1 
    with_items: 
    - ["a.sql", "b.sql"] 
#  failed_when: "'ERROR' in sh1.stdout_lines" 

私は、最後のコメント行の線に沿って何かを考えていたが、sh1がループタスクからレジスタ変数であるため、各SQLスクリプトからの出力はリストsh1results内に存在します。だから私はちょうど実行されたコマンドの特定のstdoutにアクセスする方法がわからない。

+0

シェルコマンドがゼロ以外の終了コードを返した場合、タスクは自動的に失敗します。何もする必要はありません。 – helloV

+0

@helloVエラーが発生したコマンドではありません。コマンドはsqlplusを使用してSQLスクリプトを実行し、スクリプトが正しく実行されなかった場合はsqlplusの出力に "ERROR"という単語が含まれます。 'echo $? 'でsqlplusコマンドをフォローした後に終了コード0を取得したため、シェルコマンドが正常に実行されていることがわかります –

答えて

1

あなたが正しく考えていた今まで私はこれだけの行コメントを外し、最後のコメント行、

の線に沿って何かを考えていた:

- name: Build and run SQLPlus commands 
    shell: 'echo @{{ item }} | {{ sqlplus }} {{ db_user }}/{{ db_pass }}@{{ environment }}' 
    register: sh1 
    with_items: 
    - ["a.sql", "b.sql"] 
    failed_when: "'ERROR' in sh1.stdout_lines" 

が、sh1以来のループ・タスクからのレジスタ変数です。各SQLスクリプトの出力は、のリストresultsの中にあります。 sh1;

いいえ。タスク内では、sh1ディクショナリの値は、各繰り返しで直接(リストなしで)アクセスできます。その後の作業ではリストsh1.resultsが表示されます。


しかし、上記はループ全体の実行を破ることはありませんが、これはAnipalの設計方法です。以下を実現するために...

シーケンス内のスクリプトの実行中にエラーが発生した場合、タスクは実行を停止する必要があります。

あなたは回避策を使用することができます別のファイルにタスクを保存し、(this answerを参照)include作業を繰り返します。

+0

詳細、特に例を挙げてくれてありがとうございます。私は、ブロックをループすることと同様のアイデアを持っていました。残念ながら、まだ実装されておらず、あなたが言ったように彼らが提案した[ここ](https://github.com/ansible/ansible/issues/13262)だから、それが私の最善の選択肢だと思う。 –

+0

[Ansible Docs](http://docs.ansible.com/ansible/latest/playbooks_reuse.html)によると、動的にインクルードされたタスクの出力はありません。「ダイナミックインクルード内にのみ存在するタスクは表示されませんリスト内のタスク出力。これは、 'with_fileglob'に対して以前に定義されたレジスタ変数を使用する場合にのみ発生します。'with_items'に変更すると、含まれているタスクの出力を見ることができます。 –

+0

最新のプラクティスを使用しようとしている人にとって、明らかに[include](http://docs.ansible.com/ansible/latest/include_module.html)モジュールは廃止されましたが、[include_tasks](http:// docs.ansible.com/ansible/latest/include_tasks_module.html)は2.4まで利用できません。正しいモジュールを使用していることを確認してください。 –

関連する問題