SaltStack 外部缓存数据库的部署及job管理介绍

一、Job简介
master在下发指令任务时,会附带上产生的jid。

minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行情况。

指令执行完毕将结果传送给master后,删除该临时文件。

Job缓存默认保存24小时:
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。
SaltStack 外部缓存数据库的部署及job管理介绍_第1张图片
优点: 存储数据时,不会对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@server3 ~]# yum install -y MySQL-python.x86_64

更改minion端的配置文件:

[root@server3 ~]# vim /etc/salt/minion

SaltStack 外部缓存数据库的部署及job管理介绍_第2张图片
更改后重启:

[root@server3 ~]# systemctl restart salt-minion.service 

接下来安装mysql的客户端来测试mysql的远程连接:

[root@server3 ~]# yum install mysql -y

[root@server3 ~]# mysql -h 172.25.1.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)给server3推送:

[root@server1 keepalived]# salt server3 test.ping --return mysql
server3:
    True

在这里插入图片描述
[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   | server3 | 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模块将数据发送到外部系统。
SaltStack 外部缓存数据库的部署及job管理介绍_第3张图片
优点:到外部系统的单个连接是必需的。 这对于数据库和类似系统是首选的。

缺点:给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管理也部署完成。

你可能感兴趣的:(企业实战)