Salt Stack在外部系统中存储job cache
return与job cache
每个salt-minion在执行任务后都会将执行的结果返回给salt-master,这些结果都缓存在默认的工作缓存(Default Job Cache)中.
salt-master来维护所有的工作缓存,默认的是临时缓存,只会被存储24小时,可以在master的配置文件中调整时间,单位是小时:
#以下是默认配置
#keep_jobs: 24
master默认工作缓存位置在: /var/cache/salt/master/jobs/
目录中。
minion收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下jid命名的文件,用于在执行过程中master查看当前任务的执行情况。指令执行完毕将结果传送给master后,删除该临时文件。
因为saltstack默认的job cache
是临时数据,所以都会选择外部数据库来长期存贮任务执行结果。除了默认的缓存机制,salt还提供了额外的两种机制,来将数据存储到其他的系统中,比如数据库, 本地的系统日志,或者其他你想存储的地方:
- External Job Cache
- Master Job Cache
这两种机制之间的主要区别在于返回结果的位置(来自Salt Master或Salt Minion)
saltstack-return
salt-master发送给minion的命令执行结果将返回给salt-master。而saltstack-returner提供的接口允许将返回结果发送给任意系统。它支持多种存储方式,比如用MySQL、MongoDB、Redis、Memcache等,通过return我们可以对SaltStack的每次操作进行记录,对以后日志审计提供了数据来源。目前官方已经支持40种return数据存储与接口,我们可以很方便的配置与使用它。当然也支持自己定义的return,自定义的return需由python来编写。在选择和配置好要使用的return后,只需在salt命令后面指定return即可。
所有的return模块列表:https://docs.saltstack.com/en/latest/ref/returners/all/index.html#all-salt-returners
#查看所有return列表
[root@master lamt]# salt '*' sys.list_returners
192.168.32.135:
- carbon
- couchdb
- elasticsearch
- etcd
- highstate
- local
- local_cache
- mattermost
- multi_returner
- mysql
- pushover
- rawfile_json
- slack
- slack_webhook
- smtp
- splunk
- sqlite3
- syslog
- telegram
实例:
环境说明:
主机IP | 主机名 | 安装的应用 |
---|---|---|
192.168.32.130 | master | salt-master |
192.168.32.135 | minion-2 | salt-minion |
192.168.32.140 | mysql | mysql |
均使用mysql存储返回数据
1. External Job Cache
配置了 External Job Cache 时,数据会和往常一样,返回到 salt master 本地的默认缓存。同时 minion 会运用salt returner 模块发送到配置的外部存储中。
- 优点:存储数据时不会对Salt Master造成额外的负担。
- 缺点:每个Salt Minion连接到外部作业缓存,这可能导致大量连接。还需要对所有minion配置returner模块,才能返回数据到外部存储中。
#在所有minion上安装MySQL-python模块
[root@minion-2 ~]# yum -y install MySQL-python
#mysql已安装好,并启用
[root@mysql ~]# ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:22 [::]:*
配置Mysql数据库作为存储服务器
#登录mysql,创建saltstack使用的数据库
MariaDB [(none)]> CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
#创建表和表结构
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;
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;
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;
#查看表
MariaDB [salt]> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids |
| salt_events |
| salt_returns |
+----------------+
3 rows in set (0.00 sec)
#授权访问
MariaDB [(none)]> grant all on salt.* to salt@'%' identified by 'salt';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
配置minion
#不加reture的话,使用--return mysql返回到mysql
[root@minion-2 ~]# vim /etc/salt/minion
......
return: mysql
mysql.host: '192.168.32.140'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306
#重启
[root@minion-2 ~]# systemctl restart salt-minion
在Master上测试是否存储到mysql中
[root@master ~]# salt '*' test.ping
192.168.32.135:
True
[root@master ~]# salt '*' cmd.run uptime
192.168.32.135:
00:06:43 up 2:55, 2 users, load average: 0.00, 0.01, 0.05
在mysql数据库中查询
MariaDB [salt]> select * from salt_returns\G
*************************** 1. row ***************************
fun: test.ping
jid: 20200824160537509071
return: true
id: 192.168.32.135
success: 1
full_ret: {"fun_args": [], "jid": "20200824160537509071", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "192.168.32.135"}
alter_time: 2020-08-24 12:05:37
*************************** 2. row ***************************
fun: cmd.run
jid: 20200824160642948661
return: " 00:06:43 up 2:55, 2 users, load average: 0.00, 0.01, 0.05"
id: 192.168.32.135
success: 1
full_ret: {"fun_args": ["uptime"], "jid": "20200824160642948661", "return": " 00:06:43 up 2:55, 2 users, load average: 0.00, 0.01, 0.05", "retcode": 0, "success": true, "fun": "cmd.run", "id": "192.168.32.135"}
alter_time: 2020-08-24 12:06:43
2 rows in set (0.00 sec)
2. Master Job Cache
在master上配置master job cache,而不是每个minion上配置external job cache。在此配置中,minion照常将返回的数据发给master上的默认job cache,然后在使用Salt Returner模块将数据发送给外部系统。
- 优点:到外部系统的设备只需要单个连接,这对于数据库和类似系统是首选的。
- 缺点:Master的负担过大。
#因为Return方式依赖装MySQL-python,这种方式下master和minion都要装MySQL-python
[root@master ~]# rpm -qa | grep MySQL-python
MySQL-python-1.2.5-1.el7.x86_64
[root@master ~]# salt '*' cmd.run "rpm -qa | grep MySQL-python"
192.168.32.135:
MySQL-python-1.2.5-1.el7.x86_64
#注释之前minion的配置
开启master端的master_job_cache
[root@master ~]# vim /etc/salt/master
........
master_job_cache: mysql
mysql.host: '192.168.32.140'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306
[root@master ~]# systemctl restart salt-master
清空表内容
MariaDB [(none)]> delete from salt.salt_returns;
Query OK, 9 rows affected (0.00 sec)
MariaDB [(none)]> select * from salt.salt_returns;
Empty set (0.00 sec)
在master上测试
[root@master ~]# salt '*' cmd.run 'uptime'
192.168.32.135:
09:54:54 up 30 min, 1 user, load average: 0.00, 0.01, 0.04
数据库中查询
MariaDB [(none)]> select * from salt.salt_returns\G
*************************** 1. row ***************************
fun: cmd.run
jid: 20200825015454584115
return: " 09:54:54 up 30 min, 1 user, load average: 0.00, 0.01, 0.04"
id: 192.168.32.135
success: 1
full_ret: {"fun_args": ["uptime"], "jid": "20200825015454584115", "return": " 09:54:54 up 30 min, 1 user, load average: 0.00, 0.01, 0.04", "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2020-08-25T01:54:54.713063", "fun": "cmd.run", "id": "192.168.32.135"}
alter_time: 2020-08-24 21:54:54
1 row in set (0.00 sec)
job管理
获取任务的jid
[root@master ~]# salt '*' cmd.run 'ls' -v
Executing job with jid 20200825015652647082
-------------------------------------------
192.168.32.135:
aaa
bbb
通过jid获取此任务的返回结果
[root@master ~]# salt-run jobs.lookup_jid 20200825015652647082
192.168.32.135:
aaa
bbb