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