python3 saltstack api 接入

功能介紹

  • 使用python urllib模塊香嗓,請(qǐng)求saltstack api
  • 針對(duì)saltstack api常用模塊編寫(xiě)為函數(shù)强窖,方便使用
  • saltstack api配置簡(jiǎn)單化

注意事項(xiàng)

  • 請(qǐng)保證自己的saltstack api是可以使用的露戒,請(qǐng)?jiān)谧约旱膕alt服務(wù)器中使用以下命令
curl -k https://172.28.5.190:8000/login \
-H "Accept: application/x-yaml" \
-d username='saltapi' \
-d password='saltapi' \
-d eauth='pam'
  • 執(zhí)行正常結(jié)果,主要是需要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連接報(bào)錯(cuò)
context = ssl._create_unverified_context()
ssl._create_default_https_context = ssl._create_unverified_context


class SaltAPI(object):
    __token_id = ''

    #: saltstackapi地址坡垫,請(qǐng)按照需求修改
    #: url后面不要帶  /  
    def __init__(self):
        self.__url = 'https://172.28.5.190:8000'
        self.__user = 'saltapi'
        self.__password = 'saltapi'

    #: 獲取請(qǐng)求成功參數(shù)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請(qǐng)求殊鞭,配置請(qǐng)求參數(shù)
    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

    #: 獲取各主機(jī)信息
    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語(yǔ)法有誤,請(qǐng)檢查!"

            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-*-
# 需要寫(xiě)什么方法,可以根據(jù)我的語(yǔ)法繼續(xù)編寫(xiě)数冬,很方便
from sdk_api import saltStack


#: 獲取Linux主機(jī)遠(yuǎn)程端口
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主機(jī)連接測(cè)試
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獲取磁盤(pán)信息
def getSaltDisk(saltIdList):
    salt_api = saltStack.SaltAPI()
    tgt = saltIdList
    fun = 'disk.usage'
    data = salt_api.salt_command(tgt, fun)
    return data['return'][0]


#: salt獲取內(nèi)存信息
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))

測(cè)試結(jié)果

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'}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末节槐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拐纱,更是在濱河造成了極大的恐慌铜异,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秸架,死亡現(xiàn)場(chǎng)離奇詭異揍庄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)东抹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)蚂子,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人缭黔,你說(shuō)我怎么就攤上這事食茎。” “怎么了试浙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵董瞻,是天一觀的道長(zhǎng)寞蚌。 經(jīng)常有香客問(wèn)我田巴,道長(zhǎng),這世上最難降的妖魔是什么挟秤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任壹哺,我火速辦了婚禮,結(jié)果婚禮上艘刚,老公的妹妹穿的比我還像新娘管宵。我一直安慰自己,他們只是感情好攀甚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布箩朴。 她就那樣靜靜地躺著,像睡著了一般秋度。 火紅的嫁衣襯著肌膚如雪炸庞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天荚斯,我揣著相機(jī)與錄音埠居,去河邊找鬼查牌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滥壕,可吹牛的內(nèi)容都是我干的纸颜。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绎橘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胁孙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起金踪,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浊洞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胡岔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體法希,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年靶瘸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苫亦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怨咪,死狀恐怖屋剑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诗眨,我是刑警寧澤唉匾,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站匠楚,受9級(jí)特大地震影響巍膘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芋簿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一峡懈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧与斤,春花似錦肪康、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至食寡,卻和暖如春雾狈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冻河。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工箍邮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茉帅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓锭弊,卻偏偏與公主長(zhǎng)得像堪澎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子味滞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351