2017-09-22 79 views
0

我有一個應該運行SQL腳本列表的任務。如果在序列中執行ANY腳本期間發生錯誤,則該任務應該停止執行。Ansible - 在循環任務執行期間檢查任務是否失敗

給出以下任務,是否有方法可以修改它以查看當前迭代循環的寄存器stdout,以檢查'ERROR'是否在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內;所以我不確定如何訪問剛剛執行的命令的特定標準輸出。

+0

如果shell命令返回非零退出代碼,任務將自動失敗。你不必做任何事情。 – helloV

+0

@helloV這不是錯誤的命令,該命令使用sqlplus執行SQL腳本,如果腳本沒有正確運行,sqlplus的輸出包含單詞「ERROR」。我知道shell命令執行成功,因爲在使用'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腳本的輸出位於列表中resultssh1;

否。在任務中,sh1字典中的值可以在每次迭代中直接訪問(沒有列表)。列表sh1.results將在隨後的任務中可見。


但是,上述不會破壞整個循環的執行,這是Ansible的設計。因此要實現以下內容...

如果在執行序列中的任意腳本期間發生錯誤,則應該停止執行該任務。

您可以使用一種變通方法:將任務保存到一個單獨的文件和迭代include任務(見this answer)。

+0

感謝您的詳細信息,尤其是提供示例。我有一個類似於循環包括循環塊的想法。可悲的是,它還沒有實現,並且[這裏](https://github.com/ansible/ansible/issues/13262)他們建議按你說的去做,所以我想這是我最好的選擇。 –

+0

根據[Ansible Docs](http://docs.ansible.com/ansible/latest/playbooks_reuse.html),對於動態包含的任務沒有輸出:「只存在於動態包含內的任務不會顯示in -list-tasks輸出「。這隻發生在我爲'with_fileglob'使用先前定義的寄存器變量時。將其更改爲'with_items'可以工作,我可以看到已包含任務的輸出。 –

+0

對於那些試圖使用最新的做法,顯然[包括](http://docs.ansible.com/ansible/latest/include_module.html)模塊已被棄用,但[include_tasks](http:// docs.ansible.com/ansible/latest/include_tasks_module.html)直到2.4纔可用;所以請確保您使用的是正確的模塊。 –

相關問題