簡介
系統管理員(SA)通常需要管理和維護數以百計的服務器,如果沒有自動化的配置管理和命令執行工具,那么SA的工作將會變得很繁重。例如,要給集群中的每個服務器添加一個系統用戶,那么他必須登陸到每台服務器上去逐一的執行命令。好在有編程能力的SA能通過bash + ssh的方式來自動化自己的工作,於是出現了ClusterShell這一類的工具。但這類工具只是解決了遠程命令調用的問題,並沒有對一些運維的過程進行抽象,在面對不同的操作系統等環境時,使用會變得復雜和繁瑣,對常見的運維操作,如包管理、配置文件分發也沒有很好的支持。於是出現了CFEngine,Puppet,Chef,Salt等工具,他們在遠程命令執行的基礎上對一些常見的運維操作進行了抽象,如節點分組、命令編排、狀態管理等。
Salt正是其中年輕一員,它是一個使用Python和ZeroMQ開發的開源項目,使用Apache 2.0 License。Salt的主要功能有兩個:1)配置管理,使節點處於所定義的狀態,如指定web類節點apache包的狀態為安裝並運行;2)分布式的命令執行系統,一方面分發命令到節點執行,另一方面從節點收集所需的數據。
特點
(翻譯自官方介紹http://salt.readthedocs.org/en/latest/topics/index.html)
1)簡單
salt能適用於不同規模的部署,安裝和維護都很簡單。
2)並行執行
- 由master向Minion發出的命令是並行執行的,而不是串行;
- master與Minion之間的使用加密的協議;
- 盡可能的使網絡負載降低,提高網絡傳輸效率;
- 提供簡單的編程接口;
3)基於成熟的技術
- 使用ZeroMQ進行網絡通信;
- 使用AES對通訊進行加密;
- 使用msgpack作為數據序列化的格式;
4)快、靈活、可擴展
架構
Salt主要由三個部分組成:
- salt-master:安裝有salt-master的節點我們稱作Master節點,它負責存儲配置信息、對可信的Minion節點進行授權、通過ZeroMQ與Minion節點進行交互。
- salt-minion:安裝有salt-minion的節點稱作Minion節點,salt-minion就是一個agent進程,通過ZeroMQ接收來自master的命令,執行並返回結果;
- salt-syndic:在特別龐大的部署環境中才會使用syndic,比如在多數據中心的部署中。syndic相當於一個正向代理節點,它代理了所有Master節點與Minion節點的通信。這樣做一方面可以將Master的負載分擔給多個syndic承擔。另一方面,它也可以降低Master通過廣域網訪問Minion的成本,提高了安全性,使salt適用於誇數據中心的部署。
快速體驗
http://docs.saltstack.com/topics/tutorials/walkthrough.html
體驗的步驟如下:
- 為各個節點配置fqdn,並確定各個節點之間能通過fqdn互相訪問,其中master節點的fqdn為salt(因為Minion節點啟動后會默認向salt注冊信息);
- 安裝salt,master節點安裝salt-master,Minion節點安裝salt-Minion;
- 確保防火牆關閉或打開指定的端口,salt-master主要使用4505和4506端口;
- 在master節點使用salt-key對Minion進行認證;
- 嘗試運行命令;
核心功能
Targeting(批量操作)
批量操作是指master將選取哪些minion執行命令或同步master指定的狀態。salt提供了幾種方式來選取執行操作的Minion,它們分別是:
這種方式是基於匹配minion_id,minion_id在默認情況下是minion節點的fqdn。匹配的方式支持正則表達式、通配符、列表,如:
salt ‘*' test.ping //選取所有的minion執行test.ping命令 salt -E 'web1-(prod|devel)' test.ping //選取web1-prod或web1-devel去執行命令 salt -L 'web1,web2' test.ping //選取web1和web2 salt ‘web*' test.ping //選取所有以web為前綴的節點執行
Grains是指minion節點注冊時master節點所收集的信息,比如操作系統、CPU架構等。salt也可以基於grains信息來選取執行命令的minion節點,例如:
salt -G 'os:Ubuntu' test.ping //選取所有操作系統是ubuntu的minion節點執行test.ping命令
可以使用salt -N 從配置文件中讀取指定的分組執行命令;
可以使用salt -C 來組合使用上面提到的三種匹配策略,例如:
salt -C '* and not G@os:Ubuntu' test.ping //選取所有操作系統不是Ubuntu的節點執行test.ping
通過-b參數從已匹配的節點中再次篩選指定數量的節點執行命令,例如:
salt ‘*’ -b 25% test.ping //從所有節點中選取25%執行命令
Remote Execution(命令編排)
按字面意思理解,這個核心功能可以稱作遠程調用或者遠程執行。但是中文的專業術語會翻譯成命令編排,這其中的原因我想是因為“編排”這個詞能體現在minion端所執行的命令是邏輯有序的。salt提供了很多功能不同的模塊實現了日常的運維工作,這些模塊編排了常用的運維指令和邏輯,而master能遠程調用他們完成相應的功能。例如,test.ping完成了測試minion節點是否存活,bridge.add 會添加網橋設備。
了解完這個核心功能后,salt的命令格式也變得清晰
salt [TARGETING] [COMMAND] [ARGS]
TARGETING指出了誰去執行命令,COMMAND和ARGS指出了執行什么命令以及命令的參數。其實后面講到的狀態管理也是基於這兩個核心功能構建。此外用戶還可以自己寫模塊,對salt的功能進行擴展。
States(狀態管理)
狀態管理也通常被稱作軟件配置管理(SCM, Software Configuration Management)。狀態管理程序會使讓的系統保持或到達預先定義的狀態,他會依據狀態的描述,安裝軟件包、打開或重啟服務或將配置文件分發到指定的位置並監控它的變化。
擁有狀態管理,SA可以很輕松的管理數百台或數萬台的服務器配置。將狀態管理的配置文件放置在版本管理工具(git, svn)下,能很好的管理配置的變更。
Salt States是Salt的配置管理工具。如上文所述,它本質上是Remote Execution的一個模塊。master通過命令編排調用minion上的state模塊,觸發minion從master獲取狀態描述文件(SLS文件)並按照描述文件的描述執行相應的操作。
SLS文件可以靜態的描述minion的狀態,也可以通過Grains和Jinja模板動態的生成狀態描述,狀態描述之間也存在着不同的關系。可以參照下面的文章深入的學校Salt的狀態管理。
http://thinkinside.tk/2013/06/25/salt_usage.html
http://salt.readthedocs.org/en/latest/topics/tutorials/states_pt1.html
http://salt.readthedocs.org/en/latest/ref/states/index.html
其它功能
Salt還提供了很多的擴展功能,如Returners提供了不同的存儲后端保存minion返回的數據,salt cloud添加了對AWS等公有雲的支持等。
小結
本文簡單首先介紹了系統運維的需求和運維工具的基本情況,因為我不是專職的運維人員總結的比較籠統;然后介紹了Salt的架構和核心功能。其實只要在宏觀上對Salt有一個基本的認識“它是干什么的,怎么干的”,那么以后無論是使用Salt還是基於Salt做開發都會有思路了,遇到問題查閱官方手冊基本都能解決。
要熟悉Salt的使用,動手實踐是必不可少的。我還會記錄一些在Vagrant上使用Salt的過程,也會嘗試使用Salt、vagrant去部署一個OpenStack環境。
相關資源
http://thinkinside.tk/pages/tags.html#salt-ref