文章目录
一、认识Job
1、什么是job
每一项由Salt master发出的minions管理或配置命令,都会产生与之相对应的Job事件以及Job return事件。这是Salt C/S服务通信机制设计所决定的。从这些Job事件信息中,我们能够掌握整个系统与服务当前在处理些什么、曾经处理过哪些任务以及成功与否。再讲远一点,对Salt Jobs事件信息做进一步的数据统计分析,还可以在服务运行监控和信息安全领域做很多事情。
2、job基本管理
Jid: job id 格式为%Y%m%d%H%M%S%f
master在下发指令消息时,会附带上产生的jid,minion在接收到指令开始执行时,会在本地的cachedir(默认是/var/cache/salt/minion)下的proc目录产生已该jid命名的文件,用于在执行过程中master查看当前任务的执行情况,指令执行完毕将结果传送给master后,删除该临时文件。
master将minion的执行结果存放在本地/var/cache/salt/master/jobs目录,默认缓存24小时(可通过修改master配置文件keepjobs选项调整)。
二、job管理方法
1、SaltStack模块中的job管理方法
这些功能函数共同组成了管理minion级别jobs的后端功能核心。
(1) saltutil.running ##查看minion当前正在运行的jobs
(2)salt ‘*’ saltutil.find_job ##查看指定的job id返回作业运行数据(minion正在运行的jobs)
(3)salt ‘*’ saltutil.signal_job ##给指定的jid进程发送single信号
(4)salt ‘*’ saltutil.term_job ##终止指定的jid进程(信号为15)
(5)salt ‘*’ saltutil.kill_job ##强行终止指定的jid进程(信号为9)
2、salt runner中的job管理方法
为了提高jobs管理的便利性,开发了一个runner前端和报告子系统。 jobs runner使得查看数据更简单、更清晰。
(1)salt-run jobs.active ##查看所有minion当前正在运行的jobs(在所有minions上运行saltutil.running)
(2)salt-run jobs.lookup_jid ## 从master jobs cache中查询指定jid的运行结果
(3)salt-run jobs.list_jobs ##列出当前master jobs cache中所有job,显示已经或部分返回的作业的所有作业数据
三、Schedule任务管理
SaltStack可以很容易实现批量计算任务的创建和管理
Salt的调度系统允许对minions或master进行增量执行。 调度系统对外暴露了执行任务的能力,被执行的对象可以是运行在master上的runner,也可以是在minions上运行的execution功能函数。
可以通过多种方法启用作业调度的功能:
schedule参数,在master 或 minion 配置文件中进行设置。这需要重启master或minion服务使配置生效。
Minion pillar data,调度功能是通过刷新minion的pillar数据来实现的,例如使用saltutil.refresh_pillar。
注意:调度程序在master和minions上分别执行不同的功能。 当在master上运行时,功能函数是引用runner程序,当在minion上运行时,功能函数则被指定为execution函数
。
1 在master配置文件中配置
2 在minion配置文件中配置
在/etc/salt/minion.d/目录下有一个_schedule.conf文件,这个是minion端默认配置的一个定时任务,用于更新mine信息,内容如下:
schedule:
__mine_interval: {enabled: true, function: mine.update, jid_include: true, maxrunning: 2,
minutes: 60, return_job: false, run_on_start: true}
定时执行,周期性的将数据发送到saltmaster端。
3 在pillar中配置
首先创建一个 /srv/pillar/top.sls
vim /srv/pillar/top.sls
base:
'*':
- schedule #导入的模块名
然后创建 /srv/pillar/schedule.sls
vim /srv/pillar/schedule.sls
schedule:
job: #任务名
function: cmd.run #函数
seconds: 10 #时间间隔
args:
- 'date >> /date.log'
这个调度任务的意思是 每隔10秒在 根目录的date.log文件中记录一条时间
。
创建完文件之后执行下面的命令把pillar的修改刷到minion端去
salt “*” saltutil.refresh_pillar
这样就完成了一个简单的计划任务创建,方便快捷!
想查看minion端都有哪些计划任务可以用
salt "*" pillar.get schedule
或者
salt "*" config.option schedule
四、Job数据永久存储
执行作业之后,每个Salt下属将作业结果返回给Salt Master。这些结果存储在默认的作业缓存中。
除了默认的作业缓存,Salt还提供了两个额外的机制来将作业结果发送到其他扩展系统(数据库、本地syslog和其他系统):
-
外部工作缓存 External Job Cache
-
主工作缓存 Master Job Cache
这两种机制的主要区别在于返回结果的地方(来自于Salt Master或Salt Minion)。配置这些选项中的任何一个都将使作业运行器功能自动查询远程存储以获取信息。
External Job Cache 外部工作缓存
配置了外部作业缓存后,数据像往常一样返回到Salt主机上的默认作业缓存,然后使用Salt Minion上运行的Salt returner模块将结果发送到外部作业缓存。
优点:存储数据不会给Salt Master增加额外的负载。
缺点:每个Salt Minions都连接到外部作业缓存,这会导致大量连接。还需要额外的配置,以获得所有salt Minions的returner模块设置。
实验
主机名 | ip | 服务 |
---|---|---|
server1 | 172.25.1.1 | salt-master、salt-minion、外部数据库 |
server2 | 172.25.1.2 | salt-minion |
server3 | 172.25.1.3 | salt-minion |
本次实验我只设置了一个minion端保存数据到数据库,如果要保存多个minion端返回job数据,可按照相同方法配置。
步骤一:在minion端安装MYSQL-python
我使用的是我的minion端server2主机
yum install -y MySQL-python.x86_64
步骤二:在minion端编辑/etc/salt/minion文件开启mysql数据库连接
vim /etc/salt/minion
888 return: mysql
902 mysql.host: '172.25.1.1' #设置我的数据库主机ip
903 mysql.user: 'salt'
904 mysql.pass: 'salt'
905 mysql.db: 'salt'
906 mysql.port: 3306
步骤三:重启minion服务
systemctl restart salt-minion
步骤四:在master端安装数据库并开启服务
yum install -y mariadb-server
systemctl start mariadb.service
步骤五:从官网上复制saalt数据库模板,保存为salt.sql
链接:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html#module-salt.returners.mysql
从官网下载下来后,删除17行 CREATE INDEX jid ON jids(jid) USING BTREE; #删除索引,否则后面的步骤会有冲突(删除本行)
。
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;
步骤六:在master端将salt.sql文件导入数据库
mysql < salt.sql
步骤七:手动给salt用户授予远程登陆salt数据库权限
官方数据库配置方法中未授权,需要用户登陆数据库自行授权。
grant all on salt.* to salt@'%' identified by 'salt';
步骤八:在master端测试
salt '*' test.ping
步骤九:登陆数据库查看返回信息是否已经保存
查看所有的数据库:show databases;
进入到salt数据库:use salt;
查看salt_returns表:select * from salt_returns;
Master Job Cache 主工作缓存
配置主作业缓存来从Salt主服务器发送作业结果,而不是在每个Salt从属服务器上配置一个外部作业缓存。在这个配置中,Salt Minions像往常一样将数据发送到默认的作业缓存,然后Salt Master使用运行在Salt Master上的Salt returner模块将数据发送到外部系统。
优点:只需要与外部系统进行一次连接。这是数据库和类似系统的首选。
缺点:给你的Salt Master增加了额外的负担。
实验
主机名 | ip | 服务 |
---|---|---|
server1 | 172.25.1.1 | salt-master、salt-minion |
server2 | 172.25.1.2 | salt-minion |
server3 | 172.25.1.3 | salt-minion |
server4 | 172.25.1.4 | 外部数据库 |
步骤一:在master端安装MYSQL-python
yum install -y MySQL-python.x86_64
步骤二:在master端编辑/etc/salt/master文件开启mysql数据库连接
vim /etc/salt/master
1293 master_job_cache: mysql
1294
1295 mysql.host: '172.25.1.4'
1296 mysql.user: 'salt'
1297 mysql.pass: 'salt'
1298 mysql.db: 'salt'
1299 mysql.port: 3306
步骤三:重启master服务
systemctl restart salt-master
步骤四:在远端主机server4安装数据库并开启服务
yum install -y mariadb-server
systemctl start mariadb.service
步骤五:从官网上复制saalt数据库模板,保存为salt.sql
链接:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html#module-salt.returners.mysql
从官网下载下来后,删除17行 CREATE INDEX jid ON jids(jid) USING BTREE; #删除索引,否则后面的步骤会有冲突(删除本行)
。
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;
步骤六:在远端主机上将salt.sql文件导入数据库
mysql < salt.sql
步骤七:手动给salt用户授予远程登陆salt数据库权限
官方数据库配置方法中未授权,需要用户登陆数据库自行授权。
grant all on salt.* to salt@'%' identified by 'salt';
步骤八:在master端测试
salt '*' test.ping
步骤七:在远端数据库查看minion端返回给master端的jobs信息是否已经保存到数据库
查看所有的数据库:show databases;
进入到salt数据库:use salt;
查看salt_returns表:select * from salt_returns;