前言前端
項目中使用saltstack有一段時間了,以前都是在控制檯操做,後來感受愈來愈不方便,每次操做須要登錄服務器,還須要記一堆命令。最重要的是,公司進新人以後,新人因爲不熟悉saltstack,容易產生誤操做,而saltstack這種批處理工具,誤操做的代價是很是巨大的。爲此我開發了一套saltstack的web控制檯,簡化操做的同時,實現權限的管理。python
隨着saltstack的web控制檯開發的版本迭代,咱們遇到了幾個問題,以下:mysql
1,初版控制檯,採用同步的方式執行,web控制檯等待後端執行,整個操做完成以後,纔會有結果。之前minion少的時候,這個問題不太明顯,隨着minion增多和命令的複雜度增高,這種方式很容易致使前端卡住。web
2,saltstack的python-SDK執行結果返回不明確,因爲返回結果的不統一,致使程序比較難判斷哪些命令是成功執行了,哪些minion成功執行了。sql
3,審計,操做出問題之後,須要審計以前的操做哪裏出了問題,誰操做出了問題。數據庫
咱們採起了以下的解決方案:後端
1,異步執行,web提交任務之後,後端異步處理,前端沒必要等待。執行完成後有微信推送執行結果。centos
2,執行結果格式化後,存儲在mysql,標準的返回結果讓程序容易判斷執行狀態。服務器
3,將event存儲到mysql,方便後續審計。微信
接下來,咱們介紹一下如何將saltstack的執行結果和事件存儲到mysql
第一步:有一臺mysql服務器,具體搭建過程在這裏就不介紹了。
第二步:
mysql.host: 'localhost' mysql.user: 'root' mysql.pass: '123456' mysql.db: 'salt' mysql.port: 3306 return: mysql
第三步:修改master配置文件,將event事件寫入mysql
說明:須要master所在服務器安裝MySQL-python模塊(pip install MySQL-python)
event_return: mysql return: mysql mysql.host: 'localhost' mysql.user: 'root' mysql.pass: '123456' mysql.db: 'salt' mysql.port: 3306 master_job_cache: mysql
# 保存任務信息的小時數,設置爲0表示永久保存。
keep_jobs: 0
第四步:初始化數據庫
CREATE DATABASE `salt` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; USE `salt`; -- -- Table structure for table `jids` -- DROP TABLE IF EXISTS `jids`; CREATE TABLE `jids` ( `jid` varchar(255) NOT NULL, `load` mediumtext NOT NULL, UNIQUE KEY `jid` (`jid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Table structure for table `salt_returns` -- DROP TABLE IF EXISTS `salt_returns`; CREATE TABLE `salt_returns` ( `fun` varchar(50) NOT NULL, `jid` varchar(255) NOT NULL, `return` mediumtext NOT NULL, `id` varchar(255) NOT NULL, `success` varchar(10) NOT NULL, `full_ret` mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY `id` (`id`), KEY `jid` (`jid`), KEY `fun` (`fun`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Table structure for table `salt_events` -- DROP TABLE IF EXISTS `salt_events`; CREATE TABLE `salt_events` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `tag` varchar(255) NOT NULL, `data` mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `master_id` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `tag` (`tag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第五步:重啓salt-master和salt-minion,centos下
systemctl restart salt-master
systemctl restart salt-minion
第六步:驗證執行結果是否已經存到mysql
1,執行一次測試命令,(若是saltstack沒有開啓用戶認證,就不須要帶 -a 參數)
2,登錄數據庫,查詢執行結果
select * from salt.salt_returns\G
*************************** 10. row ***************************
fun: test.ping
jid: 20181019042659785453
return: true
id: test-agent
success: 1
full_ret: {"fun_args": [], "jid": "20181019042659785453", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "test-agent"}
alter_time: 2018-10-19 04:26:59
*************************** 11. row ***************************
fun: test.ping
jid: 20181019042659785453
return: true
id: another-agent
success: 1
full_ret: {"fun_args": [], "jid": "20181019042659785453", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "another-agent"}
alter_time: 2018-10-19 04:26:59
3,查看event是否寫入mysql
select * from salt.salt_events\G *************************** 325. row *************************** id: 368 tag: salt/job/20181019042659785453/new data: {"tgt_type": "glob", "jid": "20181019042659785453", "tgt": "*", "missing": [], "_stamp": "2018-10-19T08:26:59.785923", "user": "zhenglisai", "arg": [], "fun": "test.ping", "minions": ["another-agent", "test-agent"]} alter_time: 2018-10-19 04:26:59 master_id: bogon_master
至此,saltstack已經能夠將minion執行結果和event事件寫入數據庫,供後續查看。