最近在配合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模式。網絡