自動化運維工具 SaltStack 在雲端計算環境中的實踐

luckyfriends發表於2017-05-31

https://www.ibm.com/developerworks/cn/opensource/os-devops-saltstack-in-cloud/index.html
https://www.ibm.com/developerworks/cn/views/opensource/libraryview.jsp
隨著雲端計算技術的快速普及與發展,越來越多的企業開始學習和搭建自己的雲平臺代替傳統的 IT 交付模式,企業的 IT 環境也隨之越來越複雜,常規的運維方法與技術已經無法滿足現在雲環境中系統的配置與變更。基於雲端計算的發展,大資料、認知技術及容器技術也在企業中得到了越來越多的應用,大量的伺服器管理操作、配置變更被頻繁的執行與部署,以應對多變的業務需求。按照常規的方式,運維人員需逐個伺服器進行配置調整,手動管理大量的系統資訊,難免有各種各樣的問題及事故發生。為了避免這樣的風險,本文的示例中,筆者將詳細介紹如何使用開源軟體 SaltStack 自動化運維工具對雲環境中的伺服器進行命令的遠端執行及配置管理,確保操作的安全性及高效性,降低管理員的操作風險。

本文中介紹的架構,主要是在 CentOS6.5 上進行集中部署與測試。該架構主要涉及到三 個開源軟體,分別是 Python 軟體集,SaltStack 軟體集和 ZeroMQ 訊息佇列軟體。

  • 在部署 SaltStack 軟體之前,一定要先正確安裝 python,因為 SaltStack 是由 python 所編寫。不同版本的 SaltStack 需要使用不同版本的 Python 進行匹配,避免不必要的相容性問題發生,本文將採用 python2.6.6。
  • SaltStack 軟體是一個 C/S 架構的軟體,通過管理端下發指令,客戶端接受指令的方式進行操作。
  • ZeroMQ 是一款訊息佇列軟體,SaltStack 通過訊息佇列來管理成千上萬臺主機客戶端,傳輸指令執行相關的操作。而且採用 RSA key 方式進行身份確認,傳輸採用 AES 方式進行加密,這使得它的安全性得到了保證。

下面我將詳細介紹 SaltStack 軟體的概念與工作機制。

SaltStack 的基本概念與工作原理

SaltStack 本身是一種開源的基礎架構集中化管理平臺,相比其它商業產品,其部署及配置稍顯雜。為了更好的部署和配置 SaltStak,本章節將著重介紹它的基本概念、特性與工 作原理。

SaltStack 簡介與特性

SaltStack 是一種基於 C/S 架構的伺服器基礎架構集中化管理平臺,管理端稱為 Master,客戶端稱為 Minion。SaltStack 具備配置管理、遠端執行、監控等功能,一般可以理解為是簡化版的 Puppet 和加強版的 Func。SaltStack 本身是基於 Python 語言開發實現,結合了輕量級的訊息佇列軟體 ZeroMQ 與 Python 第三方模組(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack 和 PyYAML 等)構建。

通過部署 SaltStack 環境,運維人員可以在成千上萬臺伺服器上做到批量執行命令,根據不同的業務特性進行配置集中化管理、分發檔案、採集系統資料及軟體包的安裝與管理等。

SaltStack 具有以下特性,幫助企業 IT 更好的實現系統批量管理:

  1. 部署簡單、管理方便;
  2. 支援大部分的作業系統,如 Unix/Linux/Windows 環境;
  3. 架構上使用C/S管理模式,易於擴充套件;
  4. 配置簡單、功能覆蓋廣;
  5. 主控端(Master)與被控端(Minion)基於證照認證,確保安全可靠的通訊;
  6. 支援 API 及自定義 Python 模組,輕鬆實現功能擴充套件;

SaltStack 的工作原理

SaltStack 採用 C/S 結構來對雲環境內的伺服器操作管理及配置管理。為了更好的理解它的工作方式及管理模型,本章將通過圖形方式對其原理進行闡述。

SaltStack 客戶端(Minion)在啟動時,會自動生成一套金鑰,包含私鑰和公鑰。之後將公鑰傳送給伺服器端,伺服器端驗證並接受公鑰,以此來建立可靠且加密的通訊連線。同時通過訊息佇列 ZeroMQ 在客戶端與服務端之間建立訊息釋出連線。具體通訊原理圖,如圖 1 所示,命令執行如圖 2 所示:

圖 1.SaltStack 通訊原理圖

專業術語說明:

  • Minion 是 SaltStack 需要管理的客戶端安裝元件,會主動去連線 Master 端,並從 Master 端得到資源狀態資訊,同步資源管理資訊。
  • Master 作為控制中心執行在主機伺服器上,負責 Salt 命令執行和資源狀態的管理。
  • ZeroMQ 是一款開源的訊息佇列軟體,用於在 Minion 端與 Master 端建立系統通訊橋樑。
  • Daemon 是執行於每一個成員內的守護程式,承擔著釋出訊息及通訊埠監聽的功能。

圖 2.SaltStack 操作執行原理圖

原理圖說明:

  • Minion 是 SaltStack 需要管理的客戶端安裝元件,會主動去連線 Master 端,並從 Master 端得到資源狀態資訊,同步資源管理資訊。
  • Master 作為控制中心執行在主機伺服器上,負責 Salt 命令執行和資源狀態的管理。
  • Master 上執行某條指令通過佇列下發到各個 Minions 去執行,並返回結果。

本章使大家瞭解了什麼是 SaltStack 以及它的通訊及執行原理,下一章節將主要介紹本次例項部署的架構設計。

SaltStack 的架構設計

為了讓大家更好的理解 SaltStack 在雲平臺集中化管理方面的優勢,因此,根據專案的實際情況繪製了部署架構圖,並在文中對架構圖進行了詳細說明。如圖 3 所示:

圖 3.SaltStack 部署架構圖

說明:

  • SaltStack 的所有被管理客戶端節點(如圖 3 所示 DB 和 Web),都是通過金鑰進行加密通訊,使用埠為 4506。客戶端與伺服器端的內容傳輸,是通過訊息佇列完成,使用埠為 4505。Master 可以傳送任何指令讓 Minion 執行,salt 有很多可執行模組,比如說 CMD 模組,在安裝 minion 的時候已經自帶了,它們通常位於你的 python 庫中,locate salt | grep /usr/ 可以看到 salt 自帶的所有東西。
  • 為了更好的理解架構用意,以下將展示主要的命令釋出過程:
  1. SaltStack 的 Master 與 Minion 之間通過 ZeroMq 進行訊息傳遞,使用了 ZeroMq 的釋出訂閱模式,連線方式包括 TCP 和 IPC。
  2. Salt 命令,將 cmd.run ls 命令從 salt.client.LocalClient.cmd_cli 釋出到 Master,獲取一個 Jodid,根據 jobid 獲取命令執行結果。
  3. Master 接收到命令後,將要執行的命令傳送給客戶端 minion。
  4. Minion 從訊息匯流排上接收到要處理的命令,交給 minion._handle_aes 處理。
  5. Minion._handle_aes 發起一個本地執行緒呼叫 cmdmod 執行 ls 命令。執行緒執行完 ls 後,呼叫 Minion._return_pub 方法,將執行結果通過訊息匯流排返回給 master。
  6. Master 接收到客戶端返回的結果,呼叫 master.handle_aes 方法將結果寫的檔案中。
  7. Salt.client.LocalClient.cmd_cli 通過輪詢獲取 Job 執行結果,將結果輸出到終端。

SaltStack 的安裝與配置

對 SaltStack 有了一個初步的瞭解之後,您將在本章通過實際案例操作進一步瞭解 SaltStack。本章節一共分為三個部分,分別介紹安裝環境的說明,具體安裝及安裝後的 SaltStack 配置。

SaltStack 的環境說明

由於受到硬體資源限制,測試環境將採用三臺伺服器進行部署,分別扮演不同的角色,詳細資訊如表 1 所示。

表 1.SaltStack 環境說明

SaltStack 的安裝

目前 SaltStack 支援很多平臺的部署,具體到每個平臺的安裝部署,可以參考官方檔案。本例項中將主要介紹基於 CentOS 平臺的安裝部署。

依賴元件的安裝

由於 SaltStack 是開源軟體,其很多功能是依賴其它的軟體包來完成。所以我們在安裝 SaltStack 之前需要先將以下表 2 中的依賴軟體包安裝到主機上,避免因為缺少依賴關係而產生錯誤。

 2. 依賴軟體包

軟體名 功能
Python 2.6軟體包 Python主安裝檔案
PyYAML軟體包 SaltStack 配置解析定義語法
Msgpack-python SaltStack 訊息交換庫
Jinjia2 SaltStack states 配置模版
MarkupSafe python Unicode 轉換庫
Apache-libcloud SaltStack 對雲架構編排庫
ZeroMQ SaltStack 訊息系統
Pyzm ZeroMQ python 庫
PyCryto Python 密碼庫
M2Cryto Openssl Python 包裝庫
Requests HTTP Python 庫

為了方便依賴包的安裝,本章將採用 YUM 的方式進行安裝。

首先下載並安裝 epel 源,執行以下指令,將 epel.repo 儲存到/etc/yum.repos.d 目錄下。

 wget –o /etc/yum.repos.d/epel.repohttp://mirrors.aliyun.com/repo/epel-6.repo

並通過 Yum list 命令來校驗安裝源是否生效,如出現圖 4 所示,則表明Yum源已經生效。

圖 4.SaltStack 安裝源

建立好安裝源及解決了軟體包依賴關係之後,下一步將介紹如何安裝 Saltstack master 主機。

Master 角色的安裝

如上表 2,已經清晰的列出需要依賴哪些安裝包確保 master 的成功安裝。配置好 yum 源之後,只需要輸入以下命令(如圖 5 所示),就可以在自動安裝 SaltStack 的同時,將依賴包安裝好。

圖 5.SaltStack master 主機安裝

安裝完成後,輸入 chkconfig salt-master on 將 master 服務加入到開機啟動項,這樣每次系統啟動,都會自動載入 master 服務。輸入 service salt-master start 啟動 master 服務。之後通過 netstat –antp 查詢服務狀態,結果如圖 6 所示。

圖 6.SaltStack master 服務查詢

依照本章介紹來看,master 服務已經被正確安裝並啟動,下一章將介紹如何安裝 SaltStack-Minion 到客戶端伺服器。

Minion 角色的安裝

SaltStack 是一個 C/S 結構的開源軟體,Master 通過客戶端軟體 Minion 進行指令的執行與策略的配置。如圖 7 所示,通過 yum install 命令安裝 Minion 客戶端。

圖 7.SaltStack Minion 主機安裝

安裝完成後,輸入 chkconfig salt-minion on,將 minion 服務加入到開機啟動項,這樣每次系統啟動,都會自動載入 minion 服務。輸入 service salt-minion start,啟動 minion 服務。之後通過 netstat –antp 查詢服務狀態,結果如圖 8 所示。

圖 8.SaltStack Minion 服務查詢

到目前為止,SaltStack 的安裝工作已經完成,Master 和 Minion 主機服務都已經正確開啟,埠服務正常。下一章將主要介紹如何配置 SaltStack,使其可以正常的提供各種功能。

SaltStack 的配置

SaltStack 的配置主要集中在 Master 主機端,客戶端的配置較少,本章將通過以下兩部分詳細介紹。

Minion 端配置

SaltStack-Minion 是 SaltStack 安裝在客戶端的代理,負責接收伺服器端釋出的指令並執行,同時負責客戶端的狀態監控。客戶端要想被 master 管理,需要修改其配置檔案,將伺服器指向到 Master 的地址。其配置檔案位於/etc/salt/目錄下,名為 minion,通過 vi 工具修改,如圖 9 所示。

圖 9.SaltStack Minion 配置

配置完成後,儲存並通過 service salt-minon restart 命令重啟 minion 服務。本次測試案例,並不需要其它高階功能的演示,所以客戶端到此配置結束,更多功能的配置,請參考SaltStack 官方手冊

Master 端配置

SaltStack-Master 是 SaltStack 元件的核心服務,負責釋出指令及配置檔案的分發與管理,及客戶端的管理功能。Master 要想正常提供服務,需要接受客戶端的證照認證請求。我們之前已經介紹過,SaltStack 是通過 SSL 證照認證的方式進行通訊的。如圖 10 所示操作,輸入 salt-key –l 來查詢客戶端證照狀態,並如圖 11 所示操作,輸入 salt-key –A 接受客戶端認證。

圖 10.SaltStack 證照查詢

從圖中可以看到客戶端被發現,但是處於未被接受狀態,需要管理員執行圖 11 所示指令,進行接受。

圖 11.SaltStack 接受證照

至此我們已經完成 SaltStack 的全部配置,在下一章中,將通過幾個測試場景來說明 SaltStack 在雲管理平臺的重要功能。

SaltStack 測試

通過本章節中的兩個測試案例,可以驗證 SaltStack 是否執行正常,是否可以完成預定的功能。我們可以通過 salt '*' test.ping 來測試客戶端是否線上,並被 master 管理,如圖 12 所示,如果返回 True,則說明客戶端已經被 master 管理,並處於線上狀態。

圖 12.SaltStack 接受證照

接下來,我們將通過批量執行命令和批量安裝軟體,來測試 SaltStack 的部分功能。

批量執行命令

在日常運維中,同時對多臺伺服器進行操作,是一個很平常的需求。比如批量執行 ping 操作,驗證伺服器是否線上,批量執行查詢命令,看伺服器的負載及利用率。如圖 13 所示的指令為批量查詢伺服器作業系統的版本

圖 13.SaltStack 查詢伺服器的 IP 資訊

*代表對所有的被管理客戶端進行操作,cmd.run 是命令呼叫模組,ifconfig 是具體的執行命令

批量安裝軟體

批量安裝軟體也是日常運維中的家常便飯,我們可以通過 SaltStack 的軟體推送功能,對所管理的伺服器進行進行相關軟體的批量安裝。如圖 14 所示的指令為批量安裝軟體 lrzsz 在客戶端伺服器中。

圖 14.SaltStack 安裝 lrzsz

如上圖所示,lrzsz 軟體被順利的安裝到了客戶端伺服器。 通過以上兩個測試,可以驗證 SaltStack 可以正常的為雲平臺提供集中化的管理與配置功能。

結束語

通過在 CentOS 6.5 上實現自動化運維工具 SaltStack 的部署及功能演示,可以滿足管理員對雲端計算平臺中伺服器及配置的集中化管理,提高了運維團隊的運維效率和準確性,降低了管理成本。同時通過本文,我們也對開源工具有了更多的瞭解和學習。為今後應用更多的開源工具管理雲平臺提供了夯實的技術基礎。

參考資源 (resources)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14710393/viewspace-2140125/,如需轉載,請註明出處,否則將追究法律責任。

相關文章