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獲取到的數據都是實時的, 如果不慎腳本出現錯誤或者掛掉了, 那么數據將會丟失, 直至腳本再次正常啟動.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM