saltstack 获取minion返回信息

saltstack returner

在默认情况下master远程操作minion执行的命令, 执行的结果会返回到master终端显示出来, 但是saltstack 提供了接口可以输出到其他的系统, 如mysql, redis, postgresql等

收集minion命令执行结果有2种方式:

  1. 由minion执行完后直接return
  2. 由master端获取

第一种方式是由master下发命令, 当命令执行完毕后, minion就直接把返回的信息给传到mysql即returner
image

第二种方式是master下发命令, 当minion执行命令完毕时, 还是照样把信息返回给master, 然后master再集中把返回信息存到数据库当中
image

返回的信息究竟是怎样的

# 在执行saltstack命令时, 我们可以通过--return 参数来指定returner

salt '*' test.ping --return syslog

# 查看系统/var/log/message看到日志如下
Apr 12 18:00:04 zsad1 salt-minion: {"fun_args": [], "jid": "20180412180004363873", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "zsad1"}

# 还可以同时使用多个returner, 以,分割即可
salt '*' test.ping --return syslog,postgres
  • fun_args: 执行方法时传入的参数
  • jid: job_id 任务id
  • return:
  • retcode: 执行命令返回码
  • success: 是否成功
  • fun: 执行的方法
  • id: minion的id

更多自带的returner可以查阅官网: 点我打开

使用returner

把信息存放到postgresql

需要先安装psycopg2模块

pip install psycopg2

minion配置

returner.postgres.host: '172.16.1.80'
returner.postgres.user: 'salt'
returner.postgres.passwd: 'salt'
returner.postgres.db: 'salt'
returner.postgres.port: 5432

postgres创建数据库

# 在官网复制的
psql << EOF
CREATE ROLE salt WITH PASSWORD 'salt';
CREATE DATABASE salt WITH OWNER salt;
EOF

psql -h localhost -U salt << EOF
--
-- Table structure for table 'jids'
--

DROP TABLE IF EXISTS jids;
CREATE TABLE jids (
  jid   varchar(20) PRIMARY KEY,
  load  text NOT NULL
);

--
-- 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    text NOT NULL,
  full_ret  text,
  id        varchar(255) NOT NULL,
  success   varchar(10) NOT NULL,
  alter_time   TIMESTAMP WITH TIME ZONE DEFAULT now()
);

CREATE INDEX idx_salt_returns_id ON salt_returns (id);
CREATE INDEX idx_salt_returns_jid ON salt_returns (jid);
CREATE INDEX idx_salt_returns_fun ON salt_returns (fun);
CREATE INDEX idx_salt_returns_updated ON salt_returns (alter_time);

--
-- Table structure for table `salt_events`
--

DROP TABLE IF EXISTS salt_events;
DROP SEQUENCE IF EXISTS seq_salt_events_id;
CREATE SEQUENCE seq_salt_events_id;
CREATE TABLE salt_events (
    id BIGINT NOT NULL UNIQUE DEFAULT nextval('seq_salt_events_id'),
    tag varchar(255) NOT NULL,
    data text NOT NULL,
    alter_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    master_id varchar(255) NOT NULL
);

CREATE INDEX idx_salt_events_tag on salt_events (tag);

EOF

测试

# minion修改完配置后需要先重启
salt '*' test.ping --return postgres

然后我们就可以看到返回的信息已经存到postgresql

如果不想每次都在命令里指定returner, 可在master的配置文件上添加 return:mysql

自定义 returner

saltstack 虽然自带了很多的returner, 但是还是不能满足我们所有的需求, 我们总想拿着数据干点事情, 比如存到本地文件, es上, 下面我们来看看如何自定义一个returner

自定义的returner模块文件应存放在/srv/salt/_returners 目录下

local_file.py

#!/usr/bin/env python           
# -*- coding:utf-8 -*-          
# arthur:Dear                   
# 2018-04-12 18:22:59           
       
       
import salt.config              
       
       
def __virtual__():              
    ''' 
    返回命令行调用时指定的returner名称
    '''
    return 'local_file'
       
       
def get_log_file(path_to_master_config):
    '''
    需要在minion的配置文件里配置RETURN_FILE为结果日志文件路径
    '''
    config = salt.config.client_config(path_to_master_config)
    log_file = config['RETURN_FILE']
    return log_file
       
       
def returner(ret):
    '''
    salt 默认调用的方法, 方法名必须为returner
    '''
    log_file = get_log_file('/etc/salt/minion')
    with open(log_file, 'a+') as f:
        f.write(str(ret))

把文件同步到minion上然后重启就可以使用

salt '*' test.ping --return local_file

由master端收集返回信息

第二种方法是通过event来获取minion执行的返回信息

脚本如下:


import salt.config
import salt.utils.event

__opts__ = salt.config.client_config('/etc/salt/master')
events = salt.utils.event.MasterEvent(__opts__['sock_dir'])

for event in events.iter_events(full=True):
    print('-' * 100)
    print(event)

通过脚本, salt执行的操作(包括命令, key认证等) 都可以通过event获取到, 我们可以通过event的信息来入库, 甚至是监控salt的命令的执行情况.

总结

通过returner方式来获取minion执行结果需要在所有minion上都进行配置, 如果数据需要入库的话, 还要保证所有minion与数据库的网络能够正常连接

通过event方式获取minion执行结果则没那么麻烦, 只需在master上执行脚本即可, 即便需要入库, 也只需master与数据库的连接, minion无需进行任何额外的配置, 但是需要注意的是event获取到的数据都是实时的, 如果不慎脚本出现错误或者挂掉了, 那么数据将会丢失, 直至脚本再次正常启动.

猜你喜欢

转载自www.cnblogs.com/dears/p/9138359.html