關於saltstack自動化平臺的小總結

最近在配合php開發人員開發salt自動化平臺,我負責後臺Python的自動化任務處理,另外一個同事負責前臺頁面和數據的下發。遇到了一點小小的問題,先總結下。
php


一、如何確保minion id 惟一前端

因爲人爲的去配置,可能致使mid重複,這樣致使的結果是嚴重的。後來想了下,這個能夠經過salt主動上報mid和ip的對應信息的。代碼以下:python

class CheckMid(object):
        def __init__(self):
                self.db = MySQL()
                self.tbname = 't_ip_mid_map'
                self.local = salt.client.LocalClient()

        def check_mid(self):
                for data in self.local.cmd_iter('*','grains.get',['ipv4']):
                        for key in data:
                                if data[key].has_key('ret'):
                                        iplist = data[key]['ret']
                                        if '127.0.0.1' in iplist:
                                                iplist.remove('127.0.0.1')
                                        iplist.sort()
                                        ips = ','.join(iplist)
                                        self.insert_mid(key,ips)

        def insert_mid(self,mid,ips):
                try:
                        task_num = self.db.query("select * from %s where mid = '%s'" % (self.tbname,mid))
                except Exception,e:
                        LOG.error_log(e)
                if not task_num:
                        try:
                                self.db.insert(self.tbname,{'mid':mid,'ip':ips})
                        except Exception,e:
                                LOG.error_log(e)

這段代碼主要是將mid和ip對應關係上報到數據庫的一張表中,字段mid是主鍵。前端頁面就負責展現,當新增機器和之前的機器mid重複了,在前端頁面能夠知道這個機器不可用(資產表和mid/ip表比較產生的),此時就要修改mid了。這個還能避免人爲填寫mid形成的錯誤。mysql


二、因爲state.sls是串行的,就是說不能在同一個目標機上同時執行多個state.sls。web

舉個簡單的例子:redis

salt 'salt-centos' state.sls redis.stop &
salt 'salt-centos' state.sls mysql.stop
此時就會報錯:
The function "state.sls" is running as PID 31693 .... with jid 20141016052159481497

這樣的話,最簡單的方法就是將任務放到隊列中執行,採用python的Queue隊列。
sql


三、因爲任務放到隊列執行,每次的執行結果存儲到redis。採用一個死循環根據jid去匹配redis的結果,匹配到結果則退出循環,而後能夠執行下個任務了。可是若是minion端掛了,就沒有返回結果,此時就會堵塞在循環上,後面的任務沒法執行。因而我加了個判斷,就是每次執行任務時,去test.ping。代碼以下:數據庫

try:
    for i in range(10):
        if self.salt.ping(self.mid): # 返回爲真就下發任務
            jid = self.salt.state_run(self.mid, self.act)
            break
        else:
            jid = 0 
            raise Exception,'{0} salt has problem,not return'.format(self.mid)
except Exception,e:
    LOG.error_log(e)
    pass


四、最後一個問題就是salt 分佈式架構的問題,因爲網絡問題,返回結果不穩定,怎麼確保結果返回,這個就要自定以returner。這個我寫了一個C/S結構的結果採集。master啓用server,syndic啓用client端,使用zmq socket。
centos


最後附上前端展現圖,這裏效仿了zabbix的web模式。網絡

wKiom1Q_m2ywNwwJAAGhsG2mjoo606.jpg


wKiom1Q_nGyBZp78AANbXN7LpAQ859.jpg

相關文章
相關標籤/搜索