saltstack event 實踐


今天對官網一個salt event的測試例子進行修改並總結,以更好的理解event這個怎麼用法,下面的測試都基於官網的入門步驟來做



測試1:

先在master端寫一個python腳本:


import salt.utils.event
event = salt.utils.event.MasterEvent('/var/run/salt/master')
for eachevent in event.iter_events(full=True):
    print eachevent
    print "------"


另外開一個終端,再執行命令:


salt '*' test.ping


結果如下:


{'tag': '20150227111546144547', 'data': {'_stamp': '2015-02-27T11:15:46.145663', 'minions': ['gs-ssh']}}
------
{'tag': 'new_job', 'data': {'tgt_type': 'glob', 'jid': '20150227111546144547', 'tgt': '*', '_stamp': '2015-02-27T11:15:46.147099', 'user': 'root', 'arg': [], 'fun': 'test.ping', 'minions': ['gs-ssh']}}
------
{'tag': 'salt/job/20150227111546144547/new', 'data': {'tgt_type': 'glob', 'jid': '20150227111546144547', 'tgt': '*', '_stamp': '2015-02-27T11:15:46.148181', 'user': 'root', 'arg': [], 'fun': 'test.ping', 'minions': ['gs-ssh']}}
------
{'tag': '20150227111546144547', 'data': {'fun_args': [], 'jid': '20150227111546144547', 'return': True, 'retcode': 0, 'success': True, 'cmd': '_return', '_stamp': '2015-02-27T11:15:46.216332', 'fun': 'test.ping', 'id': 'gs-ssh'}}
------
{'tag': 'salt/job/20150227111546144547/ret/gs-ssh', 'data': {'fun_args': [], 'jid': '20150227111546144547', 'return': True, 'retcode': 0, 'success': True, 'cmd': '_return', '_stamp': '2015-02-27T11:15:46.218268', 'fun': 'test.ping', 'id': 'gs-ssh'}}
------


從輸出結果看, 對於tag只是jid的, 官方在源碼中標記的註釋是"old dup event", 推測是爲了兼容舊的event系統(0.17.0版本event系統進行了更新), 本次對其不做處理. 下發任務對應的tag爲 new_job, 並且下發任務時就master端就在event中註定了那些minions需要運行(對應的data字典中的minions). 如果tag中包含 salt/job/ 字樣並且data字典中 return 爲True, 則表示該Event是minion返回的結果.


測試2:

超過timeout設置(默認爲5秒)的任務:


執行命令:

salt '*' cmd.run 'sleep 6; echo hello world'


結果如下:

{'tag': '20150227113729719091', 'data': {'_stamp': '2015-02-27T11:37:29.720087', 'minions': ['gs-ssh']}}
------
{'tag': 'new_job', 'data': {'tgt_type': 'glob', 'jid': '20150227113729719091', 'tgt': 'gs*', '_stamp': '2015-02-27T11:37:29.722007', 'user': 'root', 'arg': ['sleep 6; echo hello world'], 'fun': 'cmd.run', 'minions': ['gs-ssh']}}
------
{'tag': 'salt/job/20150227113729719091/new', 'data': {'tgt_type': 'glob', 'jid': '20150227113729719091', 'tgt': 'gs*', '_stamp': '2015-02-27T11:37:29.723067', 'user': 'root', 'arg': ['sleep 6; echo hello world'], 'fun': 'cmd.run', 'minions': ['gs-ssh']}}
------
{'tag': '20150227113734739021', 'data': {'_stamp': '2015-02-27T11:37:34.739470', 'minions': ['gs-ssh']}}
------
{'tag': 'new_job', 'data': {'tgt_type': 'glob', 'jid': '20150227113734739021', 'tgt': 'gs*', '_stamp': '2015-02-27T11:37:34.740245', 'user': 'root', 'arg': ['20150227113729719091'], 'fun': 'saltutil.find_job', 'minions': ['gs-ssh']}}
------
{'tag': 'salt/job/20150227113734739021/new', 'data': {'tgt_type': 'glob', 'jid': '20150227113734739021', 'tgt': 'gs*', '_stamp': '2015-02-27T11:37:34.740498', 'user': 'root', 'arg': ['20150227113729719091'], 'fun': 'saltutil.find_job', 'minions': ['gs-ssh']}}
------
{'tag': '20150227113734739021', 'data': {'fun_args': ['20150227113729719091'], 'jid': '20150227113734739021', 'return': {'tgt_type': 'glob', 'jid': '20150227113729719091', 'tgt': 'gs*', 'pid': 24526, 'ret': '', 'user': 'root', 'arg': ['sleep 6; echo hello world'], 'fun': 'cmd.run'}, 'retcode': 0, 'success': True, 'cmd': '_return', '_stamp': '2015-02-27T11:37:34.806601', 'fun': 'saltutil.find_job', 'id': 'gs-ssh'}}
------
{'tag': 'salt/job/20150227113734739021/ret/gs-ssh', 'data': {'fun_args': ['20150227113729719091'], 'jid': '20150227113734739021', 'return': {'tgt_type': 'glob', 'jid': '20150227113729719091', 'tgt': 'gs*', 'pid': 24526, 'ret': '', 'user': 'root', 'arg': ['sleep 6; echo hello world'], 'fun': 'cmd.run'}, 'retcode': 0, 'success': True, 'cmd': '_return', '_stamp': '2015-02-27T11:37:34.806801', 'fun': 'saltutil.find_job', 'id': 'gs-ssh'}}
------
{'tag': '20150227113729719091', 'data': {'fun_args': ['sleep 6; echo hello world'], 'jid': '20150227113729719091', 'return': 'hello world', 'retcode': 0, 'success': True, 'cmd': '_return', '_stamp': '2015-02-27T11:37:35.814281', 'fun': 'cmd.run', 'id': 'gs-ssh'}}
------
{'tag': 'salt/job/20150227113729719091/ret/gs-ssh', 'data': {'fun_args': ['sleep 6; echo hello world'], 'jid': '20150227113729719091', 'return': 'hello world', 'retcode': 0, 'success': True, 'cmd': '_return', '_stamp': '2015-02-27T11:37:35.814502', 'fun': 'cmd.run', 'id': 'gs-ssh'}}
------


除了之前test.ping測試類似的輸出外, 可以看到tag爲 new_job 的event產生後的5秒, 自動產生了一個fun值爲 saltutil.find_job, 其arg爲之前new_job的jid的event. 然後minion返回之前運行的fun值爲 cmd.run 對應的進行運行信息(pid等信息, 已確保任務正在被執行).


salt對應的處理機制:

1.master在下發指令後,如果在設置的timeout時間內, 所有minion均返回了結果, 則直接退出. 

2.如果達到timeout時間(默認是5s)後, 依然有minion沒有返回結果, 則自動觸發一個 saltutil.find_job 的任務, 去所有minion上查詢該任務是否在執行. 

3.如果minion返回任務當前正在執行中, 則等待一個新的timeout週期, 如果期間所有minion均返回了結果, 則退出; 

依次類推, 一直等到直到所有minion均返回結果. 如果期間在觸發saltutil.find_job 時minion並沒有返回任務的執行狀況, 且之前並沒有返回結果, 則認爲minion出現問題, 就會輸出"Minion did not return" 字樣(可以通過salt -v參數查詢到).


從該機制中可以知道, 如果經常出現minion無法返回結果的情況, 對於某些場景如規模較大或minion高負載的情況下, 達到設置的timeout時間時, 自動觸發 saltutil.find_job 任務, 而minion此時並沒有開始運行之前下發的任務. 導致master直接認爲"Minion did not return". 此時需要增大timeout的值(可以修改master的配置文件中的timeout選項)


同時由於master會自動觸發 saltutil.find_job 任務, 而該任務也會記入Event系統, 所以對於如Halite等第三方系統, 執行長時間的任務時, 你會發現大量的 saltutil.find_job 操作, 此爲正常現象, 無需處理。


總結:

Salt提供了強大的Event系統, 第三方程序可以輕鬆插入Event系統, 捕獲當前Salt的運行狀態, 易於擴展Salt功能.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章