系統管理員(SA)一般須要管理和維護數以百計的服務器,若是沒有自動化的配置管理和命令執行工具,那麼SA的工做將會變得很繁重。例如,要給集羣中的每一個服務器添加一個系統用戶,那麼他必須登錄到每臺服務器上去逐一的執行命令。好在有編程能力的SA能經過bash + ssh的方式來自動化本身的工做,因而出現了ClusterShell這一類的工具。但這類工具只是解決了遠程命令調用的問題,並無對一些運維的過程進行抽象,在面對不一樣的操做系統等環境時,使用會變得複雜和繁瑣,對常見的運維操做,如包管理、配置文件分發也沒有很好的支持。因而出現了CFEngine,Puppet,Chef,Salt等工具,他們在遠程命令執行的基礎上對一些常見的運維操做進行了抽象,如節點分組、命令編排、狀態管理等。html
Salt正是其中年輕一員,它是一個使用Python和ZeroMQ開發的開源項目,使用Apache 2.0 License。Salt的主要功能有兩個:1)配置管理,使節點處於所定義的狀態,如指定web類節點apache包的狀態爲安裝並運行;2)分佈式的命令執行系統,一方面分發命令到節點執行,另外一方面從節點收集所需的數據。node
(翻譯自官方介紹http://salt.readthedocs.org/en/latest/topics/index.html)git
1)簡單web
salt能適用於不一樣規模的部署,安裝和維護都很簡單。正則表達式
2)並行執行apache
3)基於成熟的技術編程
4)快、靈活、可擴展ubuntu
Salt主要由三個部分組成:後端
http://docs.saltstack.com/topics/tutorials/walkthrough.html安全
體驗的步驟以下:
批量操做是指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%執行命令
按字面意思理解,這個核心功能能夠稱做遠程調用或者遠程執行。可是中文的專業術語會翻譯成命令編排,這其中的緣由我想是由於「編排」這個詞能體如今minion端所執行的命令是邏輯有序的。salt提供了不少功能不一樣的模塊實現了平常的運維工做,這些模塊編排了經常使用的運維指令和邏輯,而master能遠程調用他們完成相應的功能。例如,test.ping完成了測試minion節點是否存活,bridge.add 會添加網橋設備。
瞭解完這個核心功能後,salt的命令格式也變得清晰
salt [TARGETING] [COMMAND] [ARGS]
TARGETING指出了誰去執行命令,COMMAND和ARGS指出了執行什麼命令以及命令的參數。其實後面講到的狀態管理也是基於這兩個核心功能構建。此外用戶還能夠本身寫模塊,對salt的功能進行擴展。
狀態管理也一般被稱做軟件配置管理(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