隨著互聯網+新形勢的發展,越來越多的企業步入雙態(穩敏雙態)IT時代,信息化環境越來越復雜,既有IOE三層架構,也有VCE、Openstack等云虛擬化架構和互聯網化的分布式大數據架構。所以,企業急需建立一套合適的配置管理庫(CMDB),像人類“大腦”一樣統一存儲從基礎架構到業務應用各層面的配置信息,以便協調“身體”(運維系統)各部分完成復雜的運維工作。
CMDB如此重要,但又是運維中最難建設好的部分,就連很多IT運維界大佬都感嘆CMDB是運維人的最痛點,他們總結CMDB建設有3大難點,而保證配置數據的準確性更是難中之難。當前業界主要靠流程控制、人工維護和自動發現解決數據鮮活、準確的問題。流程控制和人工維護都脫不了人的參與,既然我們是人、不是“神”,就意味著會“偷懶”、會出錯。在這個信息爆炸的大數據時代,再依靠人肉運維,我們已經傷不起。所以,要想數據準確,關鍵還是要靠自動發現。
今天,筆者就來談一種配置信息的自動發現方案,望能解放運維人的雙手和大腦,這樣我們可以干一些更有意義的事,比如喝喝咖啡、陪陪家人。
一、采集工具的選型
要實現配置自動發現,需要有一個好用的基礎采集工具(功若善其事、必先利其器嘛)。有些大佬可能會說:容易,自己寫一個唄。但現在是互聯網分享時代,前輩們已經踩過很多坑,并貢獻出自己的心血,我們就不必要再重復造輪子了,大可以“拿來主義”,找一個最適合自己的開源工具來用。
談到開源的自動化配置管理工具,就不得不說Puppet、Chef、Ansible和SaltStack這四駕馬車?;ヂ摼W上對這四款工具有很多詳細的介紹和對比,這里不再詳談,主要說說我們選型的理由和結論。
首先,這四款工具的實現技術分兩大派別:Ruby(Puppet、Chef)和Python(Ansible、SaltStack)。很多前輩都說過,要真正應用好一項開源技術,你必須要真正掌控它。所以技術類型的選擇是至關重要的,Python號稱是運維人的語言,其簡潔統一、運行高效的特性更適合運維人使用。另外最重要的是Python有很多完善強大的OS、網絡編程方面的第三方庫,這些是Ruby無法比擬的。所以,從技術實現角度講,Ansible和SaltStack這兩個工具更適合我們運維人玩。
第二,Ansible和SaltStack兩者最大的差別是代理技術的采用,當然SaltStack也可以通過salt-ssh命令實現類似Ansible的無代理執行能力,只是SaltStack的設計理念是通過執行代理(Minion)來實現高效和可擴展的配置管理體系。
總結下來,有代理和無代理對比優勢主要有:
1) 無需保存賬戶密碼等敏感信息,避免信息泄露,也便于管理員定期更換密碼;
2) 可采集更豐富的配置信息和關聯關系,比如可通過配置文件分析獲取深層次配置信息;
3) 可快速感知配置變化,無代理模式只能定時輪詢,增加了網絡流量的消耗;
4) 可以實現快速的文件傳輸,比如可方便實現配置文件的收集。
通過以上分析對比,我們選擇SaltStack作為配置自動采集的基礎工具。
二、采集框架的搭建
SaltStack是一款強大的、集中化的配置自動化管理工具,它可以通過grains、pillar實現上千臺服務器的配置自動收集和管理(關于SaltStack我就不普及了,大家自行問問谷哥或者度娘吧)。不過現在它只提供了比較好的命令行工具,當然官方也提供了一個名叫halite的簡單WEB UI,只是這個WEB界面長得實在是挫了點,功能也有限,對不起SaltStack這個配置自動化管理“神器”的稱號??!
所以,我們的目標是利用SaltStack的框架和擴展能力來實現配置自動化采集,采集到數據后可以輸送到配置管理庫或者集中管理。整個采集框架邏輯設計如下圖所示:
SaltStack從部署上包含Master和Minion兩大部分。一個網絡域內只需要部署一個Master實現集中發現調度和管理,Minion安裝在各個被管主機上負責接收和執行腳本,并將采集結果反饋給Master。因為本文不是重點介紹SaltSatck,所以其安裝部署就不介紹了,大家還是可以去問問無所不知的谷哥和度娘。
三、自動發現的實現
框架確定了,那么我們接下來的主要任務就是編寫一個自動發現調度腳本(框架圖中的“自動發現Discovery”),定時從Master收集數據并進行集中處理。
腳本用什么寫?當然就選運維人專用語言Python了,其可與SaltStack天然集成,腳本的主要邏輯就是定時通過grains模塊從Master獲取配置信息并集中存儲或推送給其他需要的系統。在命令行下,我們可以用:
salt '*' grains.items
或
salt '*' grains.item {key1} {key2} …
獲取所有配置信息或者指定關鍵字名稱的配置信息,比如下圖獲取Tomcat_8080配置信息:
各位親可能會覺得奇怪,常規的grains.item {Key} 命令獲取到的數據只有1項,但這里得到一個多屬性的復雜對象。這是因為實際環境中在一個主機上會安裝多個服務,也就是存在多個配置項,所以我們采用Python的字典類型(dict)來存儲每個配置項的屬性信息,這樣只要通過一個Key就能獲取到配置項的所有信息。
注:如何進行配置信息的發現采集,如何讓grains按字典格式存儲配置項的采集結果會在第五節“信息采集的擴展”里細說。
我們也可以通過:salt '*' grains.ls 獲取有哪些Key:
既然我們用了強大的Python,在實際開發時就沒必要再通過Shell去調用SaltStack的命令行了,直接用salt.client模塊調用就可以獲得一個字典類型(dict)的返回結果,Python字典類型可直接輸出成JSON格式字符串,在對這個JSON串進行解析處理即可。
代碼示意如下:
四、配置采集的擴展
有了配置自動采集框架后,我們需要的便是不斷的添磚加瓦,也就是根據管理需求和配置模型不斷擴展豐富SaltStack的grains采集腳本,并將腳本文件放在Salt Master的grains目錄下(默認為/srv/salt/_grains),然后通過“salt '*' saltutil.sync_grains ”命令將腳本文件同步到所有Minion主機端就行。
我們以Tomcat服務的配置發現為例,收集安裝路徑、WEB服務端口、Tomcat版本信息、最大線程數等信息,腳本大致如下:
通過自定義采集腳本,某個Tomcat實例的配置信息發現如下:
是不是感覺如點讀機一樣so easy!其他更多配置信息的獲取就留個各位親去大展手腳了。當然,SaltStack的應用并不只是實現配置發現這么簡單,大家可以深入挖掘,發揮其最大的潛力,實現雙態IT下的自動化運維!
作者簡介:龐輝富
?優云軟件 (全棧運維服務平臺:https://uyun.cn) 資深架構師
?10多年IT運維管理軟件的研發經驗
?致力于自動化運維解決方案的研究和推廣
更多運維技術文章請關注優云官方微信(broada_ops)
原創文章,作者:uyunops,如若轉載,請注明出處:http://www.www58058.com/25995