2016-09-06 49 views
0

我試圖用Ansible運行一個簡單的tail命令。迭代3個字符串,直到找不到所有字符串。如果發現遍歷尾部命令,直到找不到全部。Ansible:shell命令返回空白是致命的

- name: Tail the logs for string 
    shell: "tail -10 /path/to/log/file.log | egrep 'STRING1|STRING2|STRING3'" 
    register: tail 
    until: "'STRING1' and 'STRING2' and 'STRING3' not in tail.stdout_lines" 
    retries: 10 
    delay: 5 

當我運行上面的任務,並沒有什麼回報,它具有一個致命錯誤退出。儘管這是成功的例子。

fatal: [testserver]: FAILED! => {"changed": true, "cmd": "tail -10 /path/to/log/file.log | egrep 'STRING1|STRING2|STRING3'", "delta": "0:00:00.012770", "end": "2016-09-07 07:44:35.684238", "failed": true, "invocation": {"module_args": {"_raw_params": "tail -10 /path/to/log/file.log | egrep 'STRING1|STRING2|STRING3'", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 1, "start": "2016-09-07 07:44:35.671468", "stderr": "", "stdout": "", "stdout_lines": [], "warnings": []} 

我不確定它爲什麼會以致命狀態結束。

+1

' 'STRING1' 和「STRING2''始終是一個真正的價值,不管是什麼' tail.stdout_lines'包含。 –

回答

2

grep當它不匹配任何內容時返回非零值。如果要覆蓋其退出狀態:

shell: "tail -10 /path/to/log/file.log | egrep 'STRING1|STRING2|STRING3' ||:" 
+0

謝謝。這似乎避免了任務的致命結局,但似乎總是顯示任務被改變而不管輸出如何。 '直到:''STRING1'和'STRING2'和'STRING3'不在tail.stdout_lines「' 似乎上述情況沒有運行。 –

+1

@OmarE「STRING1」不在tail.stdout_lines中,「STRING2」不在tail.stdout_lines和...中。編程不是一種自然語言,''字符串沒有什麼意義。 – zerkms

+0

@zerkms即使我有一個條件'直到:''STRING1'不在tail.stdout_lines「中,任務仍然通過。 –

0

從@查爾斯達菲解決tail命令感謝意見後問題仍然與循環條件。

這裏是正確的條件: until: '"STRING1" not in tail.stdout and "STRING2" not in tail.stdout and "STRING3" not in tail.stdout'

我也用tail.stdout代替tail.stdout_lines

感謝

+0

順便說一句 - 我的觀點是,而且這些都是與你的問題無關的問題;它們是錯誤,當然,但它們不是你問到的錯誤*。 –