Python 領(lǐng)域運(yùn)用:自動(dòng)化運(yùn)維
1. 自動(dòng)化運(yùn)維簡(jiǎn)介
1.1 什么是運(yùn)維
運(yùn)維是指對(duì)硬件和軟件進(jìn)行運(yùn)營(yíng)和維護(hù),保障業(yè)務(wù)能夠長(zhǎng)期穩(wěn)定運(yùn)行。運(yùn)維,通常屬于技術(shù)部門,運(yùn)維、研發(fā)與測(cè)試同為互聯(lián)網(wǎng)產(chǎn)品技術(shù)支撐的 3 大部門。運(yùn)維的職責(zé)包括:
- 保障業(yè)務(wù)長(zhǎng)期穩(wěn)定運(yùn)行,例如,保障網(wǎng)站服務(wù)器 7 x 24 小時(shí)不間斷的運(yùn)行
- 負(fù)責(zé)服務(wù)器的網(wǎng)絡(luò)設(shè)置、網(wǎng)絡(luò)管理與系統(tǒng)性能優(yōu)化
- 保障數(shù)據(jù)安全可靠,如用戶名密碼、游戲數(shù)據(jù)、交易數(shù)據(jù)等
- 對(duì)軟件和硬件進(jìn)行日常監(jiān)控與維護(hù),隨時(shí)解決報(bào)警故障
- 業(yè)務(wù)程序更新
1.2 自動(dòng)化運(yùn)維
系統(tǒng)管理員日常會(huì)進(jìn)行大量的重復(fù)性操作,例如安裝軟件、修改配置文件、創(chuàng)建用戶、批量執(zhí)行命令等等。如果主機(jī)數(shù)量龐大,單靠人工維護(hù)實(shí)在讓人難以忍受??紤]如下需求:
需求 1: 某大型企業(yè)的生產(chǎn)網(wǎng)絡(luò)里有 100 臺(tái)思科交換機(jī),最近公司更換了 TACACS (終端訪問控制器訪問控制系統(tǒng)) 服務(wù)器,需要在這 100 臺(tái)交換機(jī)上進(jìn)行重新配置。
需求 2: 公司的網(wǎng)絡(luò)安全部門提醒這 100 臺(tái)思科交換機(jī)現(xiàn)有的 IOS 版本有很多安全漏洞,需要盡快升級(jí)它們的 IOS 版本。
有兩種方式實(shí)現(xiàn)這樣的需求:
- 手工的方式,使用 ssh 依次登錄到這 100 臺(tái)思科交換機(jī)上,輸入命令進(jìn)行配置和升級(jí)系統(tǒng)。
- 自動(dòng)的方式,編寫 Python 腳本,用程序自動(dòng)登錄到 100 臺(tái)思科交換機(jī)上并執(zhí)行相應(yīng)的命令。在登錄交換機(jī)的過程中,腳本會(huì)自動(dòng)的輸入用戶名和密碼。
自動(dòng)化運(yùn)維就是把那些傳統(tǒng)上需要手工操作進(jìn)行維護(hù)自動(dòng)化。在上面的例子中,編寫程序?qū)?100 臺(tái)交換機(jī)進(jìn)行配置和升級(jí),就是典型的自動(dòng)化運(yùn)維。在計(jì)算機(jī)專業(yè)的招聘網(wǎng)站,能搜索到大量的運(yùn)維崗位招聘,如下所示:
Shell 腳本是實(shí)現(xiàn) Linux 系統(tǒng)自動(dòng)管理以及自動(dòng)化運(yùn)維所必備的工具,除了 Shell,能夠用于 Linux 運(yùn)維的腳本語(yǔ)言還有 Python。
現(xiàn)在越來越多的公司要求運(yùn)維人員會(huì) Python 自動(dòng)化開發(fā),在計(jì)算機(jī)專業(yè)的招聘網(wǎng)站中,查詢 baidu 發(fā)布的運(yùn)維的招聘要求:
工作職責(zé)
- 負(fù)責(zé)百度運(yùn)維基礎(chǔ)設(shè)施(監(jiān)控 部署 名字服務(wù) 容器托管)的穩(wěn)定高效運(yùn)行
任職資格
- 熟練掌握 Python/Go/Perl/Shell 至少一門語(yǔ)言
從招聘可以看到,Python 成了運(yùn)維人員必備的技能,每一個(gè)運(yùn)維人員在熟悉了 Shell 之后,都應(yīng)該再學(xué)習(xí) Python 語(yǔ)言。
2. 運(yùn)維的基礎(chǔ)知識(shí)
運(yùn)維人員需要掌握掌握互聯(lián)網(wǎng)常用的中間件維護(hù)、管理,例如 nginx、docker、mysql、redis 和 mongodb等。
2.1 nginx 簡(jiǎn)介
Nginx 是一款輕量級(jí)的 Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,由于它的內(nèi)存占用少、啟動(dòng)快、高并發(fā)能力強(qiáng),在互聯(lián)網(wǎng)項(xiàng)目中廣泛應(yīng)用。中國(guó)大陸使用nginx網(wǎng)站用戶有:百度、京東、新浪、網(wǎng)易、騰訊、淘寶等。
Nginx 服務(wù)器的反向代理服務(wù)是其最常用的重要功能,當(dāng)下流行的技術(shù)架構(gòu)如下所示:
- 整個(gè)系統(tǒng)由兩部分構(gòu)成:
- nginx 反向代理服務(wù)器
- 多個(gè)應(yīng)用服務(wù)器
- 客戶端將請(qǐng)求發(fā)送到 nginx 反向代理服務(wù)器
- ngnix 根據(jù)請(qǐng)求的參數(shù)和配置將請(qǐng)求轉(zhuǎn)發(fā)給應(yīng)用服務(wù)器
- nginx 從應(yīng)用服務(wù)器獲取數(shù)據(jù)后,在返回給客戶端
通常 ngnix 作為整個(gè)應(yīng)用的入口,運(yùn)維人員需要熟練掌握 nginx 的配置和優(yōu)化。
2.2 docker 簡(jiǎn)介
Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的鏡像中,然后發(fā)布到其它 Linux 系統(tǒng)上。
把一個(gè)應(yīng)用部署到生產(chǎn)環(huán)境中,需要進(jìn)行各種安裝和配置:
- 安裝各種依賴包
- 安裝相關(guān)的應(yīng)用程序并進(jìn)行配置,例如 nginx、mysql 等
配置非常繁瑣、容易出錯(cuò),使用 docker 可以有效的解決問題:
- 開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的鏡像
- 在生產(chǎn)環(huán)境下拉取一份鏡像(已經(jīng)配置好各種依賴包),直接運(yùn)行鏡像
Docker 對(duì)于顯著的降低了應(yīng)用部署的工作量,是運(yùn)維人員必須掌握的技術(shù)。
2.3 mysql 簡(jiǎn)介
mysql 是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。目前 mysql 被廣泛地應(yīng)用在 Internet 上的中小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了 mysql 作為網(wǎng)站數(shù)據(jù)庫(kù)。
mysql 的重要特性包括:
- 使用 C 和 C++ 編寫,源代碼的可移植,支持Linux、BSD 和 Windows 等多種操作系統(tǒng)。
- 為多種編程語(yǔ)言提供了 API。這些編程語(yǔ)言包括C、C++、Java、PHP、Python等。
- 支持多線程,充分利用CPU資源,支持多用戶。
- 優(yōu)化的SQL查詢算法,有效地提高查詢速度。
- 提供多語(yǔ)言支持,常見的編碼如中文的GB
運(yùn)維人員需要熟練掌握管理、檢查、優(yōu)化 mysql 數(shù)據(jù)庫(kù)操作的管理工具。
2.4 redis 簡(jiǎn)介
redis 是一個(gè)高性能的 key-value 數(shù)據(jù)庫(kù)。redis 是非關(guān)系型數(shù)據(jù)庫(kù),將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,訪問的速度很快,能夠顯著的提高運(yùn)行效率;與之相比,mysql 是關(guān)系型數(shù)據(jù)庫(kù),主要用于存放持久化數(shù)據(jù),將數(shù)據(jù)存儲(chǔ)在硬盤中,訪問速度較慢。
redis 的配置文件位于 redis 安裝目錄下,文件名為 redis.conf,通過修改 redis.conf 文件或使用 CONFIG set 命令來修改配置。
redis 提供了大量的配置選項(xiàng),例如:
- maxmemory bytes
- 指定 Redis 最大內(nèi)存限制,Redis 在啟動(dòng)時(shí)會(huì)把數(shù)據(jù)加載到內(nèi)存中,達(dá)到最大內(nèi)存后,Redis 會(huì)先嘗試清除已到期或即將到期的 Key
- vm-enabled no
- 指定是否啟用虛擬內(nèi)存機(jī)制,VM 機(jī)制將訪問量較少的頁(yè)即冷數(shù)據(jù) swap 到磁盤上,將訪問多的頁(yè)面由磁盤 swap 到內(nèi)存中
3. 為什么用 Python 進(jìn)行運(yùn)維
現(xiàn)階段,掌握 Python 開發(fā)語(yǔ)言已經(jīng)成為高級(jí)運(yùn)維工程師的必備技能,其原因如下:
3.1 復(fù)雜的系統(tǒng)管理
在大型的互聯(lián)網(wǎng)公司中,網(wǎng)絡(luò)包含有成千上萬臺(tái)服務(wù)器,shell 腳本語(yǔ)言適合簡(jiǎn)單的系統(tǒng)管理工作,遇到復(fù)雜的自動(dòng)化任務(wù)需要用專門的開發(fā)語(yǔ)言。Python 由于語(yǔ)法簡(jiǎn)單、擁有強(qiáng)大的第三方庫(kù),是完成復(fù)雜自動(dòng)化任務(wù)的首選編程語(yǔ)言。
3.2 方便定制需求
存在有大量的自動(dòng)化運(yùn)維工具,但是現(xiàn)有的運(yùn)維軟件如 puppet、saltstack、zabbix 和 nagio 多為通用的軟件,不可能完全適用公司的所有需求,當(dāng)需要做定制、做二次開發(fā)的時(shí)候,如果掌握 Python 編程語(yǔ)言即可輕松完成需求,實(shí)現(xiàn)一個(gè)定制的運(yùn)維工具:
- 利用 Python 的第三方庫(kù),可以滿足絕大部分自動(dòng)化運(yùn)維的需求
- 利用 Python 強(qiáng)大的 WEB 框架,能夠快速開發(fā)出一個(gè)運(yùn)維管理的 WEB 界面,
3.3 幫助調(diào)試優(yōu)化程序
在開發(fā)環(huán)境中,可能沒有充分測(cè)試程序的性能;而在生產(chǎn)環(huán)境中,一個(gè)業(yè)務(wù)上線了,通過監(jiān)控發(fā)現(xiàn): CPU 使用過高、內(nèi)存占用過大。
如果運(yùn)維人員完全不懂開發(fā),只能定位到進(jìn)程級(jí)別,即找到占用資源過多的進(jìn)程,然后將問題交給開發(fā)人員處理。如果運(yùn)維人員掌握一門編程語(yǔ)言、懂開發(fā),能夠深入到業(yè)務(wù)代碼,幫助調(diào)試、優(yōu)化開發(fā)人開發(fā)的程序。
4. 常用的自動(dòng)化運(yùn)維模塊
Python 的第三方模塊提供了自動(dòng)化運(yùn)維所需的功能,如:監(jiān)控系統(tǒng)資源、網(wǎng)絡(luò)配置等,常用的模塊如下:
- psutil
psutil 是一個(gè)跨平臺(tái)庫(kù)能夠?qū)崿F(xiàn)獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率(內(nèi)存,CPU,磁盤,網(wǎng)絡(luò)等),主要用于系統(tǒng)監(jiān)控,分析和系統(tǒng)資源及進(jìn)程的管理。
- dnspython
dnspython 是一個(gè) DNS 工具包,可以用于查詢、傳輸并動(dòng)態(tài)更新 DNS 區(qū)域信息,在系統(tǒng)管理方面,可以利用查詢功能來實(shí)現(xiàn) DNS 服務(wù)監(jiān)控以及解析結(jié)果的校驗(yàn)。
- smtplib
smtplib 是一個(gè)發(fā)送電子郵件的工具包,它對(duì) smtp 協(xié)議進(jìn)行了簡(jiǎn)單的封裝。當(dāng)監(jiān)控系統(tǒng)發(fā)現(xiàn)問題時(shí),通過調(diào)用 smtplib 發(fā)送報(bào)警郵件。
- IPy
IPy 提供了對(duì)地址進(jìn)行處理的功能,主要提供了包括網(wǎng)段、網(wǎng)絡(luò)掩碼、廣播地址、子網(wǎng)數(shù)、IP類型的處理等功能。
- pycurl
cURL 是一個(gè)利用 URL 語(yǔ)法在命令行下工作的文件傳輸工具,cURL支持的通信協(xié)議有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
pycurl 是一個(gè)用 C 語(yǔ)言寫的 libcurl Python實(shí)現(xiàn),可以理解為 linux 下 curl 命令功能的 Python 封裝。
- scapy
scapy 是一個(gè)由 Python 編寫的數(shù)據(jù)包處理程序,它能夠?qū)?shù)據(jù)包進(jìn)行偽造或解包,提供發(fā)送數(shù)據(jù)包、包嗅探、應(yīng)答和反饋等功能,目前很多優(yōu)秀的網(wǎng)絡(luò)掃描攻擊工具都使用了這個(gè)模塊。
- ansible
ansible 是一個(gè)綜合的自動(dòng)化運(yùn)維工具,基于 Python 開發(fā),集合了眾多運(yùn)維工具的優(yōu)點(diǎn),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。
ansible 提供了二次開發(fā)的接口,可以編寫 python 腳本請(qǐng)求 ansible 的 接口,開發(fā)自己的運(yùn)維工具。
- saltstack
saltstack 是一種基于 C/S 架構(gòu)的集中化管理平臺(tái),管理端稱為 Master,客戶端稱為 Minion。saltstack 具備配置管理、遠(yuǎn)程執(zhí)行、監(jiān)控等功能,saltstack 本身是基于 Python 語(yǔ)言開發(fā)實(shí)現(xiàn),結(jié)合了輕量級(jí)的消息隊(duì)列軟件 ZeroMQ 與 Python 第三方模塊構(gòu)建。
通過部署 SaltStack 環(huán)境,運(yùn)維人員可以在成千上萬臺(tái)服務(wù)器上做到批量執(zhí)行命令,根據(jù)不同的業(yè)務(wù)特性進(jìn)行配置集中化管理、分發(fā)文件、采集系統(tǒng)數(shù)據(jù)及軟件包的安裝與管理等。
saltstack 提供了二次開發(fā)的接口,可以編寫 python 腳本請(qǐng)求 saltstack 的 接口,開發(fā)自己的運(yùn)維工具。