saltstack returner
在默認情況下master遠程操作minion執行的命令, 執行的結果會返回到master終端顯示出來, 但是saltstack 提供了接口可以輸出到其他的系統, 如mysql, redis, postgresql等
收集minion命令執行結果有2種方式:
- 由minion執行完后直接return
- 由master端獲取
第一種方式是由master下發命令, 當命令執行完畢后, minion就直接把返回的信息給傳到mysql即returner
第二種方式是master下發命令, 當minion執行命令完畢時, 還是照樣把信息返回給master, 然后master再集中把返回信息存到數據庫當中
返回的信息究竟是怎樣的
# 在執行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獲取到的數據都是實時的, 如果不慎腳本出現錯誤或者掛掉了, 那么數據將會丟失, 直至腳本再次正常啟動.