一、Job簡介
master在下發指令任務時,會附帶上產生的jid。
minion在接收到指令開始執行時,會在本地的/var/cache/salt/minion/proc
目錄下產生該jid命名的文件,用於在執行過程中master查看當前任務的執行情況。
指令執行完畢將結果傳送給master後,刪除該臨時文件。
Job緩存默認保存24小時:
[root@server1 master]# vim /etc/salt/master
master端Job緩存目錄:/var/cache/salt/master/jobs
查看所有minion當前正在運行的jobs(在所有minions上運行saltutil.running)
# salt-run jobs.active
列出當前master jobs cache中所有job
# salt-run jobs.list_jobs
從master jobs cache中查詢指定jid的運行結果
# salt-run jobs.lookup_jid <jid>
二、在外部系統中存儲Job結果
Job執行後,每個Salt Minion將Job結果返回給Salt Master。 這些結果存儲在默認Job緩存中。
除默認Job緩存外,Salt還提供了兩種其他機制將Job結果發送到其他系統(數據庫,本地syslog等):
- 外部Job緩存
- 主Job緩存
這兩種機制之間的主要區別在於返回結果的位置(來自Salt Master或Salt Minion)。
外部工作緩存-小型返回器
配置了外部Job緩存後,數據將像往常一樣返回到Salt Master上的Default Job Cache,然後使用在Salt Minion上運行的Salt返回模塊將結果發送到External Job Cache。
優點: 存儲數據時,不會對Salt Master造成額外的負擔。
缺點: 每個Salt Minion連接到外部作業緩存,這可能導致大量連接。 還需要進行其他配置才能在所有Salt Minions上獲得返回模塊的設置。
接下來我們來部署這種方式,我們這裏將數據庫放在server1(master端),當然也可以放在其他主機,將minion端sercer2作爲發送緩存方:
配置外部緩存數據庫
首先安裝並開啓mysql:
[root@server1 salt]# yum install -y mariadb-server
[root@server1 salt]# systemctl start mariadb.service
[root@server1 salt]# mysql #默認沒有密碼
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> exit
Bye
初始化數據庫(可以參考:https://docs.saltstack.cn/ref/returners/all/salt.returners.mysql.html#module-salt.returners.mysql):
[root@server1 ~]# vim add.sql
填入:
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;
然後導入初始化語句:
[root@server1 ~]# mysql < add.sql
導入後查看:
[root@server1 ~]# mysql
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| salt |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use salt;
Database changed
MariaDB [salt]> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids |
| salt_events |
| salt_returns |
+----------------+
3 rows in set (0.00 sec)
可以看出多了一個salt庫,且下面有一系列的表。
接着我們進行授權:
MariaDB [salt]> grant all on salt.* to salt@'%' identified by 'salt';
Query OK, 0 rows affected (0.00 sec)
MariaDB [salt]> grant all on salt.* to salt@'localhost' identified by 'salt';
Query OK, 0 rows affected (0.00 sec)
以上sql語句表示給salt用戶(密碼salt)賦予在所有其他地址和本地上的mysql的所有權限。
進行測試:
[root@server1 ~]# mysql -usalt -psalt salt
MariaDB [salt]> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids |
| salt_events |
| salt_returns |
+----------------+
可以看出授權成功。
minion端的配置
接下來進行minion的配置:
首先安裝mysql的python依賴包:
[root@server2 ~]# yum install -y MySQL-python.x86_64
更改minion端的配置文件:
[root@server2 ~]# vim /etc/salt/minion
更改後重啓:
[root@server2 ~]# systemctl restart salt-minion.service
接下來安裝mysql的客戶端來測試mysql的遠程連接:
[root@server2 ~]# yum install mysql -y
[root@server2 ~]# mysql -h 172.25.63.1 -usalt -psalt salt
MariaDB [salt]> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids |
| salt_events |
| salt_returns |
+----------------+
3 rows in set (0.00 sec)
可以看出musql的遠程連接正常。
minion端配置完成。
測試
在server1(salt-master)給server2推送:
[root@server1 ~]# salt server2 test.ping --return mysql
server2:
True
加–return mysql表示將直接返回給數據庫,推送成功後我們可以在數據庫查看:
[root@server1 ~]# mysql -usalt -psalt salt
MariaDB [salt]> select * from salt_returns;
+-----------+----------------------+--------+---------+---------+-------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| fun | jid | return | id | success | full_ret | alter_time |
+-----------+----------------------+--------+---------+---------+-------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| test.ping | 20200518161124169377 | true | server2 | 1 | {"fun_args": [], "jid": "20200518161124169377", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "server2"} | 2020-05-19 00:11:24 |
+-----------+----------------------+--------+---------+---------+-------------------------------------------------------------------------------------------------------------------------------------+---------------------+
1 row in set (0.00 sec)
MariaDB [salt]> Bye
可以看到結果已經保存到了數據庫,這種方式的Job管理部署成功。
主Job緩存-master端返回
除了在每個Salt Minion上配置外部作業緩存,還可以配置主作業緩存以從Salt Master發送作業結果。 在此配置中,Salt Minions照常將數據發送到默認作業緩存,然後Salt Master使用在Salt Master上運行的Salt Returner模塊將數據發送到外部系統。
優點:到外部系統的單個連接是必需的。 這對於數據庫和類似系統是首選的。
缺點:給Salt Master帶來額外的負擔。
接下來部署這種方式,這種方式只需要在master端部署:
master端部署
安裝mysql的python依賴包:
[root@server1 ~]# yum install -y MySQL-python.x86_64
由於數據庫已經部署好了,因此我們只需要編輯配置文件:
[root@server1 ~]# vim /etc/salt/master
[root@server1 ~]# tail -7 /etc/salt/master #在文件的最後加入以下文件
master_job_cache: mysql
mysql.host: 'localhost'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306
重啓master端:
[root@server1 ~]# systemctl restart salt-master.service
部署完成。
測試
在master端測試推送:
[root@server1 ~]# salt '*' test.ping
server2:
True
server3:
True
在數據庫中查看:
[root@server1 ~]# mysql salt
MariaDB [salt]> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids |
| salt_events |
| salt_returns |
+----------------+
3 rows in set (0.00 sec)
MariaDB [salt]> select * from salt_returns;
+-----------+----------------------+--------+---------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| fun | jid | return | id | success | full_ret | alter_time |
+-----------+----------------------+--------+---------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| test.ping | 20200518161124169377 | true | server2 | 1 | {"fun_args": [], "jid": "20200518161124169377", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "server2"} | 2020-05-19 00:11:24 |
| test.ping | 20200518161848475717 | true | server2 | 1 | {"fun_args": [], "jid": "20200518161848475717", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2020-05-18T16:18:48.661091", "fun": "test.ping", "id": "server2"} | 2020-05-19 00:18:48 |
| test.ping | 20200518161848475717 | true | server3 | 1 | {"fun_args": [], "jid": "20200518161848475717", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2020-05-18T16:18:48.686814", "fun": "test.ping", "id": "server3"} | 2020-05-19 00:18:48 |
| test.ping | 20200518161848475717 | true | server2 | 1 | {"fun_args": [], "jid": "20200518161848475717", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "server2"} | 2020-05-19 00:18:48 |
+-----------+----------------------+--------+---------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
4 rows in set (0.00 sec)
可以看到server2和server3的緩存均保存在數據庫中,這種方式的Job管理也部署完成。