一、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执行后,每个Salt Minion将Job结果返回给Salt Master。 这些结果存储在默认Job缓存中。
除默认Job缓存外,Salt还提供了两种其他机制将Job结果发送到其他系统(数据库,本地syslog等):
这两种机制之间的主要区别在于返回结果的位置(来自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@server3 ~]# yum install -y MySQL-python.x86_64
更改minion端的配置文件:
[root@server3 ~]# vim /etc/salt/minion
[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管理部署成功。
除了在每个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管理也部署完成。