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
posted @ 2020-08-25 10:07  EverEternity  阅读(386)  评论(0编辑  收藏  举报