自動(dòng)化運(yùn)維,顧名思義就是將繁瑣的人工運(yùn)維轉(zhuǎn)化為使用腳本或平臺(tái)實(shí)現(xiàn)批量化、自動(dòng)化的工作。自動(dòng)化運(yùn)維可以減輕工程師的負(fù)擔(dān),同時(shí)也可以降低人工運(yùn)維誤操作的概率。
自動(dòng)化運(yùn)維在日常的運(yùn)維工作中隨處可見(jiàn),例如在學(xué)校的機(jī)房里,可以通過(guò)自動(dòng)化運(yùn)維的方式給試驗(yàn)機(jī)安裝教學(xué)用軟件,批量安裝操作系統(tǒng)等。在服務(wù)器運(yùn)維時(shí)可以通過(guò)自動(dòng)化運(yùn)維的方式部署一些中間件和所需的服務(wù),在網(wǎng)絡(luò)運(yùn)維中可以通過(guò)自動(dòng)化運(yùn)維實(shí)現(xiàn)設(shè)備批量管理等。自動(dòng)化運(yùn)維基本可以分為自動(dòng)化運(yùn)維平臺(tái)和腳本兩種方式,其中自動(dòng)化運(yùn)維平臺(tái)常用的有Ansible、Zabbix等。運(yùn)維腳本在Windows系統(tǒng)中可以使用批處理(Batch)腳本的方式實(shí)現(xiàn),Linux中可以使用Shell腳本的方式實(shí)現(xiàn),如果有跨平臺(tái)需求的話還可以使用Python腳本來(lái)實(shí)現(xiàn)一些功能。
自動(dòng)化運(yùn)維平臺(tái)Zabbix的使用可以說(shuō)很常見(jiàn),該平臺(tái)可以通過(guò)SNMP協(xié)議等方式提供對(duì)遠(yuǎn)程服務(wù)器或網(wǎng)絡(luò)狀態(tài)的監(jiān)視、數(shù)據(jù)收集等功能。同時(shí)Zabbix也支持腳本的調(diào)用,例如在服務(wù)器中出現(xiàn)一條HTTP的告警,這時(shí)就可以通過(guò)Zabbix下發(fā)指令來(lái)執(zhí)行后續(xù)的一些操作,這里的后續(xù)操作可以是一個(gè)Python腳本,也可以是一個(gè)Shell腳本。同時(shí)Zabbix也提供API接口,工程師可以自建平臺(tái)來(lái)進(jìn)行對(duì)接,起到錦上添花的作用。但Zabbix也有一些缺點(diǎn),比如它的繪圖功能就是一個(gè)弱點(diǎn),在日常運(yùn)維中想要在一個(gè)頁(yè)面中看到內(nèi)存、磁盤、CPU、網(wǎng)絡(luò)的使用情況,Zabbix只能單獨(dú)的查看,需要看哪個(gè)參數(shù)就要去選擇相應(yīng)的頁(yè)面,使用起來(lái)較繁瑣,如下圖所示。
相應(yīng)的解決方法就是可以接入一個(gè)Grafana來(lái)優(yōu)化這方面,Grafana是一個(gè)跨平臺(tái)的開源的可視化分析工具,Grafana的圖表可以支持自定義的功能,可以實(shí)現(xiàn)很多的監(jiān)控計(jì)算。
接入Grafana之后的監(jiān)控頁(yè)面可以定制化為下圖。
Ansible是一個(gè)由Python語(yǔ)言編寫的,輕量級(jí)模塊化的運(yùn)維工具,這就意味著如果工程師對(duì)Python比較了解,就可以根據(jù)自己的需求來(lái)編寫模塊。模塊是Ansible最小的運(yùn)行單位,Ansible在部署時(shí),無(wú)需在遠(yuǎn)程服務(wù)器上安裝代理。通常的架構(gòu)是一臺(tái)主控機(jī)和若干臺(tái)受控機(jī),在工作時(shí),由主控機(jī)下發(fā)指令至受控機(jī)執(zhí)行。
如果需要執(zhí)行的命令較多,可以通過(guò)編寫Shell腳本的方式來(lái)執(zhí)行。同時(shí)Ansible眾多的模塊提供了豐富的功能,例如通過(guò)OpenSSH來(lái)連接服務(wù)器,Ping模塊可以用來(lái)測(cè)試連通性,Command模塊可以用于遠(yuǎn)程執(zhí)行命令,Cron模塊用來(lái)創(chuàng)建計(jì)劃任務(wù)。Ansible在調(diào)用模塊時(shí)有兩種方式可以選擇,一種是通過(guò)adhoc,另外一種是Playbook。比較強(qiáng)大的是通過(guò)Playbook的方式調(diào)用模塊,在Playbook中可以按照運(yùn)維工作的需求進(jìn)行DIY的編排,在編寫Playbook腳本時(shí)同時(shí)調(diào)用多個(gè)模塊,將各個(gè)模塊進(jìn)行搭配使用提高工作效率。
除了通過(guò)平臺(tái)實(shí)現(xiàn)自動(dòng)化運(yùn)維,之前也提到可以使用腳本的方式來(lái)實(shí)現(xiàn)自動(dòng)化運(yùn)維,通過(guò)腳本來(lái)實(shí)現(xiàn)自動(dòng)化運(yùn)維對(duì)工程師的基本功有較高的要求,因?yàn)榫帉懩_本要求工程師掌握相應(yīng)的腳本語(yǔ)言,并對(duì)操作系統(tǒng)有一定的了解。例如如何通過(guò)腳本批量連接服務(wù)器,如何調(diào)用設(shè)備內(nèi)系統(tǒng)的相關(guān)功能等。有了這些知識(shí)作為基礎(chǔ)就可以編寫相應(yīng)的腳本來(lái)實(shí)現(xiàn)部分功能。常用的腳本語(yǔ)言有Batch、Shell、Python等。其中Batch腳本是在Windows系統(tǒng)中最常用的。Shell腳本是在Linux系統(tǒng)中較常用的。Python可以跨平臺(tái),Windows系統(tǒng)和Linux系統(tǒng)都可以使用,同時(shí)也可以在華為的網(wǎng)絡(luò)設(shè)備中使用。Python語(yǔ)言也是目前各類語(yǔ)言中比較好掌握的一個(gè)。最快學(xué)習(xí)一周便可寫出自己的一個(gè)小程序。同時(shí)Python內(nèi)部也集成了很多的模塊,在編寫腳本的過(guò)程中如果需要一些功能,可以通過(guò)調(diào)用相應(yīng)的模塊來(lái)增強(qiáng)腳本的功能。最簡(jiǎn)單的,例如需要在Windows中調(diào)用CMD來(lái)執(zhí)行一些命令就可以調(diào)用OS模塊來(lái)實(shí)現(xiàn),之后再將命令傳遞給os.system()或os.popen()就可以了,如果需要執(zhí)行一些其他的功能但是Python內(nèi)部并沒(méi)有相應(yīng)的模塊的話,還可以通過(guò)安裝第三方模塊來(lái)實(shí)現(xiàn)。
拿一個(gè)自動(dòng)關(guān)機(jī)腳本來(lái)舉個(gè)小例子吧。如圖所示,這是一個(gè)Windows系統(tǒng)定時(shí)關(guān)機(jī)的Python腳本,用戶在使用時(shí)可以根據(jù)自己實(shí)際的需要來(lái)輸入預(yù)計(jì)在幾個(gè)小時(shí)后關(guān)閉設(shè)備。同時(shí)也提供了在一些情況下需要取消自動(dòng)關(guān)機(jī)的解決辦法。
其中這部分是將OS模塊引入到腳本中,這里會(huì)調(diào)用OS模塊中的一些方法。
這里使用了一組print函數(shù)是為了給用戶一個(gè)提示,畢竟使用這個(gè)小工具的人不一定是編寫這個(gè)腳本的人,所以要簡(jiǎn)單說(shuō)明腳本如何使用。
這里用一個(gè)變量time來(lái)承接用戶輸入的內(nèi)容。為了增加一些友好度,寫了一些提示。
拿到用戶輸入的內(nèi)容之后,便開始進(jìn)行判斷,首先判斷用戶是否要進(jìn)行計(jì)劃關(guān)機(jī)操作。如果是關(guān)機(jī)操作的話,會(huì)將用戶的輸入內(nèi)容返回到屏幕上用來(lái)給用戶做二次確認(rèn)。同時(shí)也給用戶一個(gè)糾錯(cuò)的選項(xiàng)。如果二次確認(rèn)沒(méi)問(wèn)題,那么就開始進(jìn)行一個(gè)計(jì)算,因?yàn)樵赪indows系統(tǒng)中shutdown命令后面的時(shí)間是按秒計(jì)算的,所以這里直接做一個(gè)乘法。最后將關(guān)機(jī)命令前綴“shutdown-s-t”與所得到的時(shí)間進(jìn)行一個(gè)拼接,將拼接之后的字符串傳遞給os.popen來(lái)調(diào)用Windows系統(tǒng)命令執(zhí)行該操作。以上說(shuō)的是進(jìn)行關(guān)機(jī)的操作,如果用戶在二次確認(rèn)時(shí)發(fā)現(xiàn)時(shí)間輸入有誤,則不會(huì)執(zhí)行字符串拼接和時(shí)間計(jì)算的過(guò)程,直接退出程序。
最后這一部分是當(dāng)用戶想要取消計(jì)劃關(guān)機(jī)時(shí)所執(zhí)行的命令,當(dāng)用戶輸入“off”時(shí),程序會(huì)取消之前的計(jì)劃關(guān)機(jī)任務(wù)。
這個(gè)例子是一個(gè)很簡(jiǎn)單的小腳本,其實(shí)里面還有很多的功能可以進(jìn)行優(yōu)化,例如用戶二次確認(rèn)之后如果輸入有錯(cuò)誤可以進(jìn)行重新輸入等其他功能,甚至可以做成對(duì)話框交互的形式。
聊了這么多自動(dòng)化運(yùn)維的實(shí)現(xiàn)方法,使用自動(dòng)化運(yùn)維的主要目的還是降低人工的負(fù)擔(dān)和誤操作率。以前一百臺(tái)設(shè)備的運(yùn)維可能需要5個(gè)人來(lái)完成,但是1000臺(tái)設(shè)備10個(gè)人也不一定能完全覆蓋到,還有在做一些系統(tǒng)錄入的時(shí)候,如果單靠人工的逐條錄入,不僅工作效率低,時(shí)間成本也會(huì)增加。所以,自動(dòng)化運(yùn)維技術(shù)在日常的工作中仍是一個(gè)需要去不斷去學(xué)習(xí)的。與其在眾多設(shè)備中忙到脫發(fā),不如寫一個(gè)腳本,喝杯茶等待工作自動(dòng)完成。