黃旭東 劉潔 周文粲 張東湖
(北京大學人民醫院 北京市 100044)
自從電子計算機誕生以來,信息技術的發展日新月異,短短幾十年,IT 技術已經普及到人們的工作和生活中,各行業的電算化變革已是昨天的故事,如今各行各業都在積極投入信息化建設,IT 信息系統猶如人體的神經一樣重要,成為開展業務不可或缺的重要組成部分。
醫院的信息化建設也是緊跟時代步伐,先后建立了HIS、EMR、LIS、PIS、PACS 等多個系統,用計算機系統替代了紙質單據流轉,讓醫療業務和配套的物資、財務、決策等業務更加高效[1];而隨著醫院向數字醫療的轉型,信息系統的側重點從服務于醫院內部管理向服務于患者傾斜,信息系統的數量達到幾十個、上百個[2];同時,醫院在經歷了藥品零加成、耗材零加成等醫療改革后,需要強化內部管理,借助信息系統對各項工作進行優化以便提高經營效益,對信息系統按業務特性進行打包組合,建設了醫療業務、區域醫療協同、運營管理、后勤保障、科研、教學等多個業務系統集群[3]。業務系統擴建和新增的背后,是服務器數量的急劇增長,從幾十臺增長到數百臺,其中大型醫院在一千臺左右。
數字醫療轉型帶來的服務器數量劇增,給服務器的運維工作提出了新的挑戰——如何在不增加運維工程師的情況下,有效管理大量服務器?
傳統的手工運維,是運維工程師登錄一臺服務器進行運維操作,完成之后再登錄下一臺服務器;熟練的工程師可以同時操作多臺服務器,但同時操作的服務器數量也很有限;即便每個工程師都變成熟練工,也是把運維工程師變成了流水線上擰螺絲的工人,大量時間花在簡單、重復的工作上,沒有發揮出運維工程師的價值。因此,需要轉變思路,尋找自動化的運維工具,讓計算機程序代替人來做簡單重復的工作,讓工程師把節省下來的時間用在其他有技術含量的工作上。
軟件行業有商業軟件和開源軟件兩大分支。開源軟件一直是軟件行業的一支重要力量,為軟件技術的發展做出了不可磨滅的貢獻,例如知名的開源軟件Linux、Java、MySql、Eclipse、Apache、Hadoop、Android 等[4]。開源的自動化運維工具也有不少,例如Zabbix、SaltStack、Fabric、Ansible 等。開源軟件具有源代碼開放、支持二次開發、可以免費使用等優點[5],因此本文的首選是對開源工具進行二次開發。
醫院的信息系統,既有運行在Windows 上的,也有運行在Linux 上的,選擇自動化運維工具首先考慮的因素,是工具對這兩大操作系統陣營提供了良好的支持[6]。按照這個標準,調研到的開源工具有Chef、Puppet、Ansible、Terraform、saltstack 等,其中Ansible 是這些工具里非常出色的[7],本系統選擇了Ansible 并對其進行二次設計和開發。
Ansible 是Red Hat 公司出品的開源自動化運維工具,基于Python 語言開發,可管理Windows 和Linux 等多種操作系統;具有配置管理、應用程序部署、遠程命令執行、復雜任務編排等功能;可管理數千臺服務器,有良好的并發管理;使用是免費的,不需要給任何公司或機構支付費用;提供了二次開發的API 接口[7],在遵守GPL 3.0 協議的前提下可以任意修改Ansible 的代碼、進行二次開發、免費使用或分發修改后及二次開發后的程序。
本系統設計和建設的思路,是使用軟件開發的螺旋模型,每一次迭代實現一些功能,經過多次迭代開發出功能豐富的系統。
經過運維小組內部討論,本文選擇實現的首個功能是磁盤空間自動巡檢,原因如下:
2.4.1 常見痛點
磁盤空間不足是一個常見的生產問題,一旦發生會影響正常的業務使用,是運維工作日常的一個關注點。依靠人工對服務器的磁盤空間進行巡檢,工作量大、單調重復、效率低、容易遺漏或誤報。如果能自動化巡檢磁盤空間并預警,在節省人工、結果準確性等方面收到的效果會很明顯,自動化運維系統的后續建設工作容易得到各方的支持。
2.4.2 涵蓋Windows 和Linux
Windows 磁盤分區與Linux 有很大差異,但是容量、可用容量等邏輯概念是相同的。本系統通過調用Ansible 的API 的方式遠程執行命令,獲取Windows 和Linux 的磁盤信息。
2.4.3 便于驗證
人工對比數據,數據量小了不足以驗證有效性,數據量大了費時費力不易操作,因此需要設計一個快速對比大量數據的方法,用來檢驗系統運行情況。某醫院現有一套虛擬化平臺[8],虛擬化平臺提供的工具可以導出所有虛機的磁盤空間數據,包括分區名稱、總容量、可用容量等。用虛擬化平臺導出的數據和本系統的數據進行大量數據進行比對,驗證本系統采樣的結果是否準確,非常方便,省時省力又高效。如果兩個系統的數據出現較大偏差時,可以人工登錄到操作系統中查看數據,確認哪個系統的數據是準確的。
2.4.4 無入侵性
Linux 和Windows 獲取磁盤空間是從操作系統的文件中讀取數據,進行格式轉換等操作。即獲取磁盤空間數據是一個讀取操作,不會在磁盤上寫入內容引起磁盤空間的數據發生變化,也不會更改操作系統里的磁盤空間數據,這樣既避免了操作失誤影響生產環境,又便于比較本系統采樣到的數據和原始數據。
2.4.5 資源消耗低
如前所述“df”命令和“wmic logicaldisk”是從幾個系統文件中讀取數據并進行簡單的運算,對客戶機的性能消耗極低;Ansible對單個客戶機發送命令,以及回傳結果,加起來總共不超過2000字節,對網絡帶寬占用極低;Ansible 默認的并發數量是一個批次5個客戶機,對網絡吞吐量占用很低。
Ansible 提供了配置管理、遠程命令執行等非常有用的功能,但是只有命令行界面,所有的功能都是輸入命令和參數、或者編寫復雜的playbook 才能實現。對于零基礎的人來說,需要花不少時間先學習Ansible 的模塊、配置項等基礎知識,再學習各種命令和playbook,學習周期很長,記住命令和參數的難度較大,對初學者不太友好。
另一方面,按照等級保護的要求,在生產環境中,信息系統需要有用戶管理、權限控制、審計等功能,而原生的Ansible 沒有提供這些功能。
因此,需要對Ansible 進行二次開發,將常見功能變成web 圖形化界面,運維人員用鼠標操作就能進行自動化運維,這樣能大幅降低使用門檻、減少編寫Ansible 命令或腳本出錯的概率;同時,增加用戶管理、權限控制、審計等功能,以便符合等級保護的要求,讓本系統適用于企業環境。
系統架構設計如圖1所示。

圖1
主機即服務器,是指部署在醫院的物理服務器和虛擬服務器,包括Windows 系統和Linux 系統。
Ansible 管理主機,是指安裝了Ansible 程序的服務器,一個企業中有一個Ansible 管理主機即可(為避免歧義,下文使用“管理主機”指代安裝了Ansible 的管理主機,“主機”或“服務器”指代其他服務器)。
基礎服務層,根據功能劃分為多個模塊:
(1)資源管理模塊是指在系統中登記服務器的信息。標簽管理是根據業務特點設置的標簽列表,有業務系統、操作系統版本等,便于在后續的操作中通過標簽快速選擇一批服務器。服務器的信息有IP 地址、操作系統名稱、標簽等,其中標簽是從標簽列表中選擇,不能手工輸入。
(2)任務管理模塊的功能是創建、修改、查看任務。腳本管理用于選擇要執行的腳本、設置執行時間、設置執行周期等。臨時命令是編寫并執行Ansible 的ad-hoc 命令。
(3)Ansible 接口模塊包括了特定功能的腳本、調用Ansible的API、解析Ansible 結果、將解析結果寫入數據庫或返回上層等功能。
(4)其他模塊包括了Ansible 的連接參數、密鑰文件以及審計功能等。Ansible 連接參數是指Ansible 連接服務器使用的端口、用戶名、通信協議、身份認證方式等。Ansible 既支持用戶名+密碼的方式連接主機,也支持用戶名+密鑰文件的方式連接主機;本系統采用了RSA 密鑰文件的方式,安全性更高,也便于統一部署、管理。審計管理主要是記錄用戶登錄、用戶操作等信息,用于事后審計。
業務展示層是可視化的WEB 網站,提供用戶操作的界面、權限管理等功能。用戶登錄WEB 后,在網頁上進行任務管理、密鑰管理、主機管理等各種操作,以及查看任務結果。用戶管理是用戶賬號的創建、啟用、禁用等。權限管理是給用戶賬號分配權限,允許使用哪些功能。
本系統的功能依賴于Ansible,需要在服務器環境中部署Ansible 才能運行。狹義的Ansible 部署是在管理主機上安裝并配置好Ansible 程序。廣義的Ansible 部署還包括更改主機的設置。不管是Windows,還是Linux,操作系統默認的設置無法與Ansible 通信,需要修改系統設置才能讓主機和Ansible 通信,實現自動化運維。
定期巡檢和手工發起單次巡檢的工作流程和具體實現完全相同,除了定期巡檢有額外的定時任務管理。流程中各節點功能如下:
第一步,用戶在web 頁面上選擇服務器,發起巡檢任務。
第二步,根據服務器的操作系統,生成對應的命令。Linux的命令是“df”;Window 的命令是“wmic logicaldisk get name,filesystem,size,freespace”。接著調用Ansible 的API 將命令發送到服務器上執行。
第三步,將Ansible 返回的命令結果,解析并轉換為一個數據集,格式為
第四步,對比本次數據和歷史數據,根據一定的規則,生成預警信息。
第五步,在web 頁面上提示用戶巡檢已完成。如有預警信息,在web 頁面上提示用戶。
第六步,用戶查看巡檢結果或預警信息。
本文第一批試點,選擇了某醫院不同版本的Linux 和Windows共50 臺,其中大部分是虛擬化服務器,也有少量的物理服務器,;設置了每周四自動運行一次磁盤空間巡檢任務。待巡檢完成后,人工查看任務的執行時長,以及對比巡檢數據和虛擬化平臺導出的數據、對比巡檢數據和物理服務器的數據。
經過8 周的試驗,自動巡檢50 臺服務器的平均時間在20 秒以內;本系統的巡檢數據和虛擬化平臺的數據、和物理服務器的數據相差在萬分之一以下,考慮到兩組數據的采樣存在時間差,可以認為兩組數據完全一致,本系統獲取的數據完整、準確。
第二批試點,將某醫院的幾百臺服務器全都添加到本系統。經過半年以上的運行,在很大程度上替代了人工巡檢磁盤空間的工作,大幅減少了運維人員花在磁盤空間巡檢上的時間;每周預警10-20次,全面性和準確性都高于人工巡檢;借助本系統,運維多次化解了磁盤空間不足的風險,將事故消滅在了萌芽階段。
本系統經過半年以上的運行,能夠穩定、高效、準確地對數以百計的服務器進行磁盤空間巡檢,既涵蓋了物理服務器和虛擬服務器,又涵蓋了主流的Linux 和Windows 系統,可用于醫院環境的自動化運維;本系統提高了運維工作的效率,降低了服務器的故障率,增強了基礎架構的穩定性,有力保障了醫院業務的順利開展。