SaltStack遠程執行Windows job程序(黑窗口)填坑經過


  近期接到領導通知,要將公司內的所有Windows服務添加到自動發布系統中,由於這種服務很多,節點分布散亂,每次都是由開發主管手動替換(雖然他們自己開發了自動打包替換工具,但仍需要一台一台登陸到服務器上去執行)。

  工作需求:讓所有服務(黑窗口的.exe)在前台cmd顯式運行,不能納入系統服務(不能以服務的形式啟動)。

  其實一開始我是懵逼的,雖然很順利的完成了拉取程序代碼,編譯程序,替換文件,停止進程,但在啟動黑窗口時,遇到了問題:

 就是通過jenkins的pipeline腳本去調用salt-master分發命令時,后台服務已經順利跑起來,但是jenkins后台日志卻卡在這里,導致jenkins的這個job不能正常釋放,這樣的話,自動化發布是算失敗的。

 然后我就開始各種查資料,各種測試,搗鼓了好幾天,終於解決了這個問題。

  解決這個問題的過程和思路:

  ①一開始我以為是start命令的問題,然后開始查找各種start命令的參數,全部試了,還是沒解決。

  ②后來請教其他大牛,得到了一個思路,是salt這邊沒有返回執行結果,導致jenkins這邊釋放不了;緊接着我打開了salt-minion的debug模式,看了一段時間日志,發現日志的結果是無限執行一段代碼:

  得出的結論是:我發布的這個程序是不是有問題(無限執行,不退出?),然后問了開發,但是開發好像沒鳥我;后來我又想,應該不是這個問題,發布其他程序的時候也是調用各種start,應該不是這個問題。那么為啥后台一直重復刷這些日志呢,肯定是在執行某些任務,然后我自己測試了一下,執行:

salt '*' cmd.run "start cmd"

  發現后台日志也是一直在刷,后來我漸漸明白,因為cmd這個窗口不退出的話,salt會一直去執行這個任務,不會退出,除非關掉這個cmd窗口。

  ③那么到底該怎么解決這個問題?我想到了用bat腳本,python腳本,在腳本中寫命令去調用這個啟動命令,然后試了bat腳本,還是不行,python的os模塊調用的也是start命令,我感覺應該也不行,也沒有試,還要安裝python;所以我直接選擇了powershell,不得不說,還是很牛逼的這個powershell.找到了powershell的官方文檔,簡單學習了一下,就把這個問題搞定了。

  

  還有一點需要注意的是:

  ①saltstack操作windows可視化的時候有個問題,如果salt-minion是非手動以服務方式啟動的話,是看不到任務窗口的,都會以SYSTEM這個用戶以進程的方式在后台運行,解決之道是將salt-minion改為手動命令行啟動。

  參考文檔:http://www.mamicode.com/info-detail-1892884.html

  ②powershell參考文檔:technet.microsoft.com/en-us/library

  pipeline中的代碼示例:

sh 'salt \'tp_inservice2\' cmd.run "start-process ZP.Crm.Task.Scheduler.Engine.exe -workingdirectory \'D:\\crmService\\ZP.Crm.Task.Scheduler.Engine1-huidu\'" shell=\'powershell\''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM