python3 saltstack api 接入

功能介绍

  • 使用python urllib模块,请求saltstack api
  • 针对saltstack api常用模块编写为函数,方便使用
  • saltstack api配置简单化

注意事项

  • 请保证自己的saltstack api是可以使用的,请在自己的salt服务器中使用以下命令
curl -k https://172.28.5.190:8000/login \
-H "Accept: application/x-yaml" \
-d username='saltapi' \
-d password='saltapi' \
-d eauth='pam'
  • 执行正常结果,主要是需要token
return:
- eauth: pam
  expire: 1542725811.402969
  perms:
  - .*
  - '@wheel'
  - '@runner'
  start: 1542682611.402966
  token: 541d1b86d29daaff1c1cbb8f01a454de0bf4cba3
  user: saltapi
  • 脚本文件目录
- salt_api
  - __init__.py
  - saltStack.py
  - saltDao.py
  - test.py

saltStack.py

#!/usr/bin/env python
# -*-coding:utf-8-*-
import urllib
import urllib.parse
import urllib.request
import ssl
import json

#: 解决saltstack api ssh连接报错
context = ssl._create_unverified_context()
ssl._create_default_https_context = ssl._create_unverified_context


class SaltAPI(object):
    __token_id = ''

    #: saltstackapi地址,请按照需求修改
    #: url后面不要带  /  
    def __init__(self):
        self.__url = 'https://172.28.5.190:8000'
        self.__user = 'saltapi'
        self.__password = 'saltapi'

    #: 获取请求成功参数token值
    def token_id(self):
        params = {'eauth': 'pam', 'username': self.__user, 'password': self.__password}
        encode_params = urllib.parse.urlencode(params).encode(encoding='utf-8')
        content = self.post_request(encode_params, prefix='/login')
        self.__token_id = content['return'][0]['token']

    #: 使用post请求,配置请求参数
    def post_request(self, params, prefix='/'):
        url = self.__url + prefix
        headers = {'X-Auth-Token': self.__token_id}
        req = urllib.request.Request(url, params, headers=headers)
        data = urllib.request.urlopen(req).read().decode("utf-8")
        content = json.loads(data)
        return content

    #: 获取各主机信息
    def salt_command(self, tgt, fun, arg=''):
        self.token_id()
        params = {'client': 'local'}
        try:
            if tgt and fun:
                if type(tgt) == list:
                    params['expr_form'] = 'list'
                    params['tgt'] = ','.join(tgt)
                else:
                    params['tgt'] = tgt
                params['fun'] = fun

            else:
                return "salt语法有误,请检查!"

            if arg:
                params['arg'] = arg

            encode_params = urllib.parse.urlencode(params).encode(encoding='utf-8')
            content = self.post_request(encode_params)
            return content
        except Exception as e:
            return e

saltDao.py

#!/usr/bin/env python
# -*-coding:utf-8-*-
# 需要写什么方法,可以根据我的语法继续编写,很方便
from sdk_api import saltStack


#: 获取Linux主机远程端口
def getHostSsh(saltIdList):
    salt_api = saltStack.SaltAPI()
    tgt = saltIdList
    fun = 'cmd.run'
    arg = "netstat -lnpt | grep sshd | grep -v 'tcp6' | awk '{print $4}' | awk -F':' '{print $2}'"
    data = salt_api.salt_command(tgt, fun, arg)
    return data['return'][0]


#: salt-minion主机连接测试
def getSaltTest(saltIdList):
    salt_api = saltStack.SaltAPI()
    tgt = saltIdList
    fun = 'test.ping'
    data = salt_api.salt_command(tgt, fun)
    return data['return'][0]


#: salt ganins信息获取
def getSaltGrains(saltIdList):
    salt_api = saltStack.SaltAPI()
    tgt = saltIdList
    fun = 'grains.items'
    data = salt_api.salt_command(tgt, fun)
    return data['return'][0]


#: salt获取磁盘信息
def getSaltDisk(saltIdList):
    salt_api = saltStack.SaltAPI()
    tgt = saltIdList
    fun = 'disk.usage'
    data = salt_api.salt_command(tgt, fun)
    return data['return'][0]


#: salt获取内存信息
def getSaltMem(saltIdList):
    salt_api = saltStack.SaltAPI()
    tgt = saltIdList
    fun = 'status.meminfo'
    data = salt_api.salt_command(tgt, fun)
    return data['return'][0]

test.py

#!/usr/bin/env python
# -*-coding:utf-8-*-
from sdk_api import saltDao

#: saltIdList 有两种选择
#: 1.列表   saltIdList=[]
#: 2.*      saltIdList="*"
saltIdList = ["tender", "salt-master"]
memory = saltDao.getSaltMem(saltIdList)
for saltId, saltJson in memory.items():
    print("saltId: %s" % saltId)
    for key, values in saltJson.items():
        print("\t%s: %s" % (key, values))

测试结果

saltId: tender
    WritebackTmp: {'value': '0', 'unit': 'kB'}
    SwapTotal: {'value': '2031612', 'unit': 'kB'}
    Active(anon): {'value': '61448', 'unit': 'kB'}
    SwapFree: {'value': '2031612', 'unit': 'kB'}
    KernelStack: {'value': '2592', 'unit': 'kB'}
    MemFree: {'value': '652804', 'unit': 'kB'}
    HugePages_Rsvd: {'value': '0'}
    Active(file): {'value': '120004', 'unit': 'kB'}
    NFS_Unstable: {'value': '0', 'unit': 'kB'}
    VmallocChunk: {'value': '34359566684', 'unit': 'kB'}
    Writeback: {'value': '0', 'unit': 'kB'}
    Inactive(file): {'value': '80904', 'unit': 'kB'}
    MemTotal: {'value': '1004112', 'unit': 'kB'}
    VmallocUsed: {'value': '162832', 'unit': 'kB'}
    DirectMap1G: {'value': '0', 'unit': 'kB'}
    HugePages_Free: {'value': '0'}
    AnonHugePages: {'value': '2048', 'unit': 'kB'}
    Inactive: {'value': '81276', 'unit': 'kB'}
    Active: {'value': '181452', 'unit': 'kB'}
    Inactive(anon): {'value': '372', 'unit': 'kB'}
    CommitLimit: {'value': '2533668', 'unit': 'kB'}
    Hugepagesize: {'value': '2048', 'unit': 'kB'}
    Cached: {'value': '74144', 'unit': 'kB'}
    SwapCached: {'value': '0', 'unit': 'kB'}
    VmallocTotal: {'value': '34359738367', 'unit': 'kB'}
    Shmem: {'value': '384', 'unit': 'kB'}
    Dirty: {'value': '4', 'unit': 'kB'}
    Mapped: {'value': '11164', 'unit': 'kB'}
    SUnreclaim: {'value': '26260', 'unit': 'kB'}
    Unevictable: {'value': '0', 'unit': 'kB'}
    SReclaimable: {'value': '19776', 'unit': 'kB'}
    Slab: {'value': '46036', 'unit': 'kB'}
    DirectMap2M: {'value': '1040384', 'unit': 'kB'}
    HugePages_Surp: {'value': '0'}
    Bounce: {'value': '0', 'unit': 'kB'}
    HugePages_Total: {'value': '0'}
    AnonPages: {'value': '59408', 'unit': 'kB'}
    PageTables: {'value': '3936', 'unit': 'kB'}
    HardwareCorrupted: {'value': '0', 'unit': 'kB'}
    DirectMap4k: {'value': '8192', 'unit': 'kB'}
    Mlocked: {'value': '0', 'unit': 'kB'}
    Buffers: {'value': '127144', 'unit': 'kB'}
    Committed_AS: {'value': '253820', 'unit': 'kB'}
saltId: salt-master
    WritebackTmp: {'value': '0', 'unit': 'kB'}
    SwapTotal: {'value': '2097148', 'unit': 'kB'}
    Active(anon): {'value': '244896', 'unit': 'kB'}
    SwapFree: {'value': '1541672', 'unit': 'kB'}
    KernelStack: {'value': '7488', 'unit': 'kB'}
    MemFree: {'value': '105100', 'unit': 'kB'}
    HugePages_Rsvd: {'value': '0'}
    Active(file): {'value': '71508', 'unit': 'kB'}
    NFS_Unstable: {'value': '0', 'unit': 'kB'}
    VmallocChunk: {'value': '34359310332', 'unit': 'kB'}
    CmaFree: {'value': '0', 'unit': 'kB'}
    Writeback: {'value': '0', 'unit': 'kB'}
    Inactive(file): {'value': '48576', 'unit': 'kB'}
    MemTotal: {'value': '997956', 'unit': 'kB'}
    VmallocUsed: {'value': '177400', 'unit': 'kB'}
    DirectMap1G: {'value': '0', 'unit': 'kB'}
    HugePages_Free: {'value': '0'}
    AnonHugePages: {'value': '57344', 'unit': 'kB'}
    Inactive: {'value': '360432', 'unit': 'kB'}
    Active: {'value': '316404', 'unit': 'kB'}
    Inactive(anon): {'value': '311856', 'unit': 'kB'}
    CommitLimit: {'value': '2596124', 'unit': 'kB'}
    Hugepagesize: {'value': '2048', 'unit': 'kB'}
    Cached: {'value': '130104', 'unit': 'kB'}
    SwapCached: {'value': '44408', 'unit': 'kB'}
    VmallocTotal: {'value': '34359738367', 'unit': 'kB'}
    CmaTotal: {'value': '0', 'unit': 'kB'}
    Shmem: {'value': '10060', 'unit': 'kB'}
    Dirty: {'value': '12', 'unit': 'kB'}
    Mapped: {'value': '26652', 'unit': 'kB'}
    SUnreclaim: {'value': '75284', 'unit': 'kB'}
    Unevictable: {'value': '0', 'unit': 'kB'}
    SReclaimable: {'value': '49340', 'unit': 'kB'}
    MemAvailable: {'value': '122132', 'unit': 'kB'}
    Slab: {'value': '124624', 'unit': 'kB'}
    DirectMap2M: {'value': '972800', 'unit': 'kB'}
    HugePages_Surp: {'value': '0'}
    Bounce: {'value': '0', 'unit': 'kB'}
    HugePages_Total: {'value': '0'}
    AnonPages: {'value': '517560', 'unit': 'kB'}
    PageTables: {'value': '17264', 'unit': 'kB'}
    HardwareCorrupted: {'value': '0', 'unit': 'kB'}
    DirectMap4k: {'value': '75648', 'unit': 'kB'}
    Mlocked: {'value': '0', 'unit': 'kB'}
    Buffers: {'value': '12', 'unit': 'kB'}
    Committed_AS: {'value': '3229088', 'unit': 'kB'}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335