Saltstack (六) --- Job管理 及 外部緩存數據庫的部署

一、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管理也部署完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章