【saltstack】saltstack執行結果和事件存儲到mysql

前言前端

    項目中使用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服務器,具體搭建過程在這裏就不介紹了。

第二步:修改minion配置文件,將minion執行結果寫入mysql

說明:須要minion所在服務器安裝MySQL-python模塊(pip install MySQL-python

如安裝過程報錯,找不到Python.h,centos下能夠:sudo yum install python-devel

如找不到mysql.confg,centos下能夠:sudo yum install mariadb-devel

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事件寫入數據庫,供後續查看。

相關文章
相關標籤/搜索