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