了解一下設定管理工具,以找出哪個最適合你的 DevOps 組織。
DevOps 正因為有提高產品品質、縮短產品開發時間等優勢,目前備受業界關注,同時也在長足發展當中。
DevOps 的核心價值觀是團隊文化、自動化、評估和分享(CAMS),同時,團隊對 DevOps 的執行力也是 DevOps 能否成功的重要因素。
DevOps 的另一個思想是任何東西,包括伺服器、資料庫、網路、紀錄檔檔案、應用設定、文件、自動化測試、部署流程等,都可以通過程式碼來管理。
在本文中,我主要介紹設定管理的自動化。設定管理工具作為基礎架構即程式碼(IaC)的一部分,支援使用經過測試和驗證的軟體開發實踐,通過明文定義檔案管理和設定資料中心。
DevOps 團隊只需要通過操作簡單的組態檔,就可以實現應用開發中包括版本控制、測試、小型部署、設計模式在內的這些最佳實踐。總而言之,設定管理工具實現了通過編寫程式碼來使基礎架構的設定和管理變得自動化。
設定管理工具可以提高應用部署和變更的效率,還可以讓這些流程變得可重用、可延伸、可預測,甚至讓它們維持在期望的狀態,從而讓資產的可控性提高。
使用設定管理工具的優勢還包括:
設定管理工具主要分為拉取模式和推播模式。拉取模式是指安裝在各台伺服器上的代理定期從中央儲存庫拉取最新的設定並應用到對應的伺服器上;而推播模式則由中央伺服器的中央伺服器會觸發其它受管伺服器的更新。
目前設定管理工具有很多,不同的設定管理工具都有自己最適合的使用場景。而對於下面五個我按照字母順序列出的設定管理工具,都對 DevOps 有明顯的幫助:全都具有開源許可證、使用外部組態檔、支援無人值守執行、可以通過指令碼自定義執行。下面對它們的介紹都來源於它們的軟體庫和官網內容。
“Ansible 是一個極其簡潔的 IT 自動化平台,可以讓你的應用和系統以更簡單的方式部署。不需要安裝任何代理,只需要使用 SSH 的方式和簡單的語言,就可以免去指令碼或程式碼部署應用的過程。”——GitHub Ansible 程式碼庫
Ansible 是我最喜歡的工具之一,我在幾年前就開始使用了。你可以使用 Ansible 在命令列中讓多個伺服器執行同一個命令,也可以使用 YAML 格式的劇本來讓它自動執行特定的操作,這促進了技術團隊和非技術團隊之間的溝通。簡潔、無代理、組態檔對非技術人員友好是它的幾個主要優點。
由於 Ansible 不需要代理,因此對伺服器的資源消耗會很少。Ansible 預設使用的推播模式需要借助 SSH 連線,但 Ansible 也支援拉取模式。劇本 可以使用最少的命令集編寫,當然也可以擴充套件為更加精細的自動化任務,包括引入角色、變數和其它人寫的模組。
你可以將 Ansible 和其它工具(包括 Ansible Works、Jenkins、RunDeck、ARA 等)結合起來使用,因為這些工具 提供了執行劇本時的可追溯性,這樣就可以建立控制流程的中央控制台。
“CFEngine 3 是一個流行的開源設定管理系統,它主要用於為大規模的系統提供自動化設定和維護。”——GitHub CFEngine 程式碼庫
CFEngine 最早在 1993 年由 Mark Burgess 作為自動設定管理的科學方法提出,目的是降低計算機系統設定中的熵,最終收斂到期望的設定狀態,同時還闡述了冪等性是讓系統達到期望狀態的能力。Burgess 在 2004 年又提出了承諾理論,這個理論描述了代理之間自發合作的模型。
CFEngine 的最新版本已經用到了承諾理論,在各個伺服器上的代理程式會從中央儲存庫拉取設定。CFEngine 的設定對專業技能要求較高,因此它比較適合技術團隊使用。
“為整個基礎架構在設定管理上帶來便利的一個系統整合框架。”——GitHub Chef 程式碼庫
Chef 通過由 Ruby 編寫的“菜譜”來讓你的基礎架構保持在最新、最相容的狀態,這些“菜譜”描述了一系列應處於某種狀態的資源。Chef 既可以通過用戶端-伺服器端的模式執行,也可以在 chef-solo 這種獨立設定的模式下執行。大部分雲提供商都很好地整合了 Chef,因此可以使用它為新機器做自動設定。
Chef 有廣泛的使用者基礎,同時也提供了完備的工具包,讓不同技術背景的團隊可以通過“菜譜”進行溝通。儘管如此,它仍然算是一個技術導向的工具。
“Puppet 是一個可以在 Linux、Unix 和 Windows 系統上執行的自動化管理引擎,它可以根據集中的規範來執行諸如新增使用者、安裝軟體包、更新伺服器設定等等管理任務。”——GitHub Puppet 程式碼庫
Puppet 作為一款面向運維工程師和系統管理員的工具,在更多情況下是作為設定管理工具來使用。它通過用戶端-伺服器端的模式工作,使用代理從主伺服器獲取設定指令。
Puppet 使用宣告式語言或 Ruby 來描述系統設定。它包含了不同的模組,並使用清單檔案記錄期望達到的目標狀態。Puppet 預設使用推播模式,但也支援拉取模式。
“為大規模基礎結構或應用程式實現自動化管理的軟體。”——GitHub Salt 程式碼庫
Salt 的專長就是快速收集資料,即使是上萬台伺服器也能夠輕鬆完成任務。它使用 Python 模組來管理設定資訊和執行特定的操作,這些模組可以讓 Salt 實現所有遠端操作和狀態管理。但設定 Salt 模組對技術水平有一定的要求。
Salt 使用用戶端-伺服器端的結構(Salt minions 是用戶端,而 Salt master 是伺服器端),並以 Salt 狀態檔案記錄需要達到的目標狀態。
DevOps 工具領域一直在發展,因此必須時刻關注其中的最新動態。希望這篇文章能夠鼓勵讀者進一步探索相關的概念和工具。為此,雲原生計算基金會(CNCF)在 Cloud Native Landscape Project 中也提供了很好的參考案例。