2017-02-03 46 views
0

過去一週我一直在解決這個問題,我擔心我的解決方案根據SaltStack文檔不是常規的。我們在全國各地的各種服務器上運行大約20個小時,並且需要能夠不僅監視它們,而且還時常發出命令和mysql查詢。這是很容易從CLI通過做類似:以編程方式訪問saltstack minion

salt '[minion name here]' cmd.run "tail -4 /usr/local/bin/file.txt" 

這將有效地返回最後四線file.txt的運行僕從在服務器上。然而,我們接下來要做的是有一個腳本,它定期將這個文件拉下來並將它緩存在salt master上。由於SaltStack是用python編寫的,所以在我們的守護進程/ cron作業中使用相同的語言是不容小覷的。然而,我們遇到的問題是我們非常想要一種與SaltStack接口的方式,而不必訴諸於從我們的python腳本中運行一個進程。目前我們有下面的代碼行做幾乎同樣的事情:

subprocess.Popen(['salt', minion, 'cmd.run', '"tail -4 /usr/local/bin/file.txt"', '--out', 'json'], stdout=subprocess.PIPE) 

讀入文件已經很明顯是有辦法做到這一點通過SaltStack提供後。我們遇到的問題是,我們無法弄清楚在不使用子進程模塊的情況下真正運行這樣的命令所需的代碼。此外,我們還希望對這些小部分執行遠程mysql查詢,但是我們經驗不足(或者太愚蠢)以至於我們無法破譯相關代碼應該是什麼。

出於示例的目的,我們希望列出位於我們的一個節點上的所有數據庫。我們發現以下兩篇文章解釋瞭如何做到這一點,但我們對實際執行哪些內容以獲得最終結果感到困惑。

https://docs.saltstack.com/en/2015.8/ref/clients/index.html 
https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.mysql.html 

從我們期望能夠使用salt.modules.mysql.db_list mysql的鹽模塊,但是根據該函數不接受任何參數的文檔。我們將如何指定我們想要運行查詢的哪個minion?我認爲會有一些實例化salt.modules.mysql的新實例的方法,該實例持有對有問題的僕從的引用,但似乎沒有這樣的功能存在。有誰能幫助我們解決這個問題嗎?

回答

1

如果執行從CLI模塊和你的僕從IDS開始與特定的,像db-00db-01,你會做這樣的事情:

salt 'db*' mysql.db_list

還有其它的方法不是依賴於奴才ID 。閱讀更多關於targeting minions的更多信息。

從python中可以做到your linked docs中描述的相同。一個稍微調整的例子:

import salt.client 

local = salt.client.LocalClient() 
local.cmd('db-*', 'mysql.db_list') 
+0

非常感謝。 5個月後,我終於實現了答案。工作讓我太忙了:( – CzechErface