saltapi腳本實例

本文已默認(rèn)你已經(jīng)搭建好了salt-api環(huán)境矾屯,如果未搭好,請參考安裝salt api

直接上腳本

# -*- coding: utf-8 -*-
# author: itimor

import requests
import datetime

salt_info = {
    "url": "http://localhost:8080",
    "username": "salt",
    "password": "123"
}


class SaltAPI(object):
    def __init__(self, url, username, password):
        self.__url = url
        self.__username = username
        self.__password = password
        self.__header = dict()
        self.__header["Accept"] = "application/json"
        self.token_s_time = ''
        self.__token = self.get_token()

    def get_token(self, prefix='/login'):
        """
        登錄獲取token
        """

        data = {
            "username": self.__username,
            "password": self.__password,
            "eauth": "pam"
        }
        loginurl = self.__url + prefix
        req = requests.post(loginurl, data=data, headers=self.__header, verify=False)
        try:
            token = req.json()["return"][0]["token"]
            self.token_s_time = datetime.datetime.now()
            return token
        except KeyError:
            raise KeyError

    def salt_request(self, data, prefix='/'):
        """
        接收請求矗钟,返回結(jié)果
        """

        token_e_time = datetime.datetime.now()
        print("token_e_time: %s" % token_e_time)
        print("token_s_time: %s" % self.token_s_time)

        if (token_e_time - self.token_s_time).seconds/3600 > 3:
            print("salt-api token is Expired")
            self.get_token()

        url = self.__url + prefix
        self.__header["X-Auth-Token"] = self.__token

        # 傳入data參數(shù)字典逼侦,data為None 則方法為get舶替,有date為post方法
        if data:
            req = requests.post(url, data=data, headers=self.__header, verify=False)
        else:
            req = requests.get(url, headers=self.__header)

        return req.json()

    def list_key(self):
        """
        獲取包括認(rèn)證、未認(rèn)證salt主機(jī)
        """

        prefix = '/keys'
        content = self.salt_request(None, prefix)

        accepted = content['return']['minions']
        denied = content['return']['minions_denied']
        unaccept = content['return']['minions_pre']
        rejected = content['return']['minions_rejected']
        return {"accepted": accepted, "denied": denied, "unaccept": unaccept, "rejected": rejected}

    def accept_key(self, key_id):
        """
        接受salt主機(jī)
        """

        data = {'client': 'wheel', 'fun': 'key.accept', 'match': key_id}
        content = self.salt_request(data)
        ret = content['return'][0]['data']['success']
        return ret

    def delete_key(self, key_id):
        """
        刪除salt主機(jī)
        """

        data = {'client': 'wheel', 'fun': 'key.delete', 'match': key_id}
        content = self.salt_request(data)
        ret = content['return'][0]['data']['success']
        return ret

    def minions_status(self):
        """
        salt主機(jī)存活檢測
        """

        data = {'client': 'runner', 'fun': 'manage.status'}
        content = self.salt_request(data)
        ret = content['return'][0]

        up = ret['up']
        down = ret['down']
        ups = []
        downs = []
        for host in up:
            ups.append({'hostname': host, 'status': 'up'})
        for host in down:
            downs.append({'hostname': host, 'status': 'down'})
        ret['up'] = ups
        ret['down'] = downs
        return ret

    def remote_cmd(self, tgt, fun, client='local_async', expr_form='list', arg='', **kwargs):
        """
        異步執(zhí)行遠(yuǎn)程命令挣菲、部署模塊
        """

        data = {'client': client, 'tgt': tgt, 'fun': 'cmd.run', 'arg': arg, 'expr_form': expr_form}
        content = self.salt_request(data)
        ret = content['return'][0]['jid']
        print(content)
        return ret

    def get_result(self, jid):
        """
        通過jid獲取執(zhí)行結(jié)果
        """

        data = {'client': 'runner', 'fun': 'jobs.lookup_jid', 'jid': jid}
        content = self.salt_request(data)
        ret = content['return'][0]
        return ret

    def get_job_info(self, jid=''):
        """
        獲取任務(wù)的詳細(xì)執(zhí)行信息
        """

        if jid:
            prefix = '/jobs/' + jid
        else:
            prefix = '/jobs'

        content = self.salt_request(None, prefix)
        ret = content['return'][0]
        return ret

    def running_jobs(self):
        """
        獲取運行中的任務(wù)
        """

        data = {'client': 'runner', 'fun': 'jobs.active'}
        content = self.salt_request(data)
        ret = content['return'][0]
        return ret

    def check_job(self, jid):
        """
        檢查任務(wù)是否已經(jīng)執(zhí)行并成功退出
        """

        data = {'client': 'runner', 'fun': 'jobs.exit_success', 'jid': jid}
        content = self.salt_request(data)
        ret = content['return'][0]
        return ret

    def remote_server_info(self, tgt, args=('fqdn', 'os', 'ipv4', 'cpu_model', 'mem_total')):
        """
        獲取遠(yuǎn)程主機(jī)信息
        """

        data = {'client': 'local', 'tgt': tgt, 'fun': 'grains.items'}
        content = self.salt_request(data)
        items = content['return'][0][tgt]
        ret = dict()
        for item in args:
            ret[item] = items[item]
        return ret


def main():
    sapi = SaltAPI(url=salt_info["url"], username=salt_info["username"], password=salt_info["password"])
    # cmd = 'netstat'
    tgt = 'sh-aa-01'
    # jid = sapi.remote_cmd(tgt=tgt, fun='cmd.run', arg=cmd)
    # print(jid)
    print(sapi.remote_server_info(tgt))


if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掷邦,隨后出現(xiàn)的幾起案子白胀,更是在濱河造成了極大的恐慌,老刑警劉巖耙饰,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纹笼,死亡現(xiàn)場離奇詭異,居然都是意外死亡苟跪,警方通過查閱死者的電腦和手機(jī)廷痘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來件已,“玉大人笋额,你說我怎么就攤上這事∨窭” “怎么了兄猩?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我枢冤,道長鸠姨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任淹真,我火速辦了婚禮讶迁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘核蘸。我一直安慰自己巍糯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布客扎。 她就那樣靜靜地躺著祟峦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徙鱼。 梳的紋絲不亂的頭發(fā)上宅楞,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音疆偿,去河邊找鬼咱筛。 笑死,一個胖子當(dāng)著我的面吹牛杆故,可吹牛的內(nèi)容都是我干的迅箩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼处铛,長吁一口氣:“原來是場噩夢啊……” “哼饲趋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撤蟆,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奕塑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后家肯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龄砰,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年讨衣,在試婚紗的時候發(fā)現(xiàn)自己被綠了换棚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡反镇,死狀恐怖固蚤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歹茶,我是刑警寧澤夕玩,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布你弦,位于F島的核電站,受9級特大地震影響燎孟,放射性物質(zhì)發(fā)生泄漏禽作。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一揩页、第九天 我趴在偏房一處隱蔽的房頂上張望领迈。 院中可真熱鬧,春花似錦碍沐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至磁浇,卻和暖如春斋陪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背置吓。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工无虚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衍锚。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓友题,卻偏偏與公主長得像,于是被迫代替她去往敵國和親戴质。 傳聞我的和親對象是個殘疾皇子度宦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)告匠,斷路器戈抄,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • 第八章 上一章 第七章 (八) 在這一天中,周圍親戚都相繼知道了這件事后专,紛紛前來探望划鸽。按照家鄉(xiāng)人的禮節(jié),各自買來水...
    安戈洛閱讀 214評論 0 0
  • Android 進(jìn)階到高級 - 突破篇 歡迎訪問我的博客:Android 解憂雜貨店 GitHub :https:...
    Android解憂雜貨店閱讀 3,115評論 2 40