集羣管理工具Salt

簡介

系統管理員(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.htmlgit

1)簡單web

    salt能適用於不一樣規模的部署,安裝和維護都很簡單。正則表達式

2)並行執行apache

  • 由master向Minion發出的命令是並行執行的,而不是串行;
  • master與Minion之間的使用加密的協議;
  • 儘量的使網絡負載下降,提升網絡傳輸效率;
  • 提供簡單的編程接口;

3)基於成熟的技術編程

  • 使用ZeroMQ進行網絡通訊;
  • 使用AES對通信進行加密;
  • 使用msgpack做爲數據序列化的格式;

4)快、靈活、可擴展ubuntu

架構

Salt主要由三個部分組成:後端

  1. salt-master:安裝有salt-master的節點咱們稱做Master節點,它負責存儲配置信息、對可信的Minion節點進行受權、經過ZeroMQ與Minion節點進行交互。
  2. salt-minion:安裝有salt-minion的節點稱做Minion節點,salt-minion就是一個agent進程,經過ZeroMQ接收來自master的命令,執行並返回結果;
  3. salt-syndic:在特別龐大的部署環境中才會使用syndic,好比在多數據中心的部署中。syndic至關於一個正向代理節點,它代理了全部Master節點與Minion節點的通訊。這樣作一方面能夠將Master的負載分擔給多個syndic承擔。另外一方面,它也能夠下降Master經過廣域網訪問Minion的成本,提升了安全性,使salt適用於誇數據中心的部署。 

快速體驗

http://docs.saltstack.com/topics/tutorials/walkthrough.html安全

體驗的步驟以下:

  1. 爲各個節點配置fqdn,並肯定各個節點之間能經過fqdn互相訪問,其中master節點的fqdn爲salt(由於Minion節點啓動後會默認向salt註冊信息);
  2. 安裝salt,master節點安裝salt-master,Minion節點安裝salt-Minion;
  3. 確保防火牆關閉或打開指定的端口,salt-master主要使用4505和4506端口;
  4. 在master節點使用salt-key對Minion進行認證;
  5. 嘗試運行命令;

核心功能

Targeting(批量操做) 

批量操做是指master將選取哪些minion執行命令或同步master指定的狀態。salt提供了幾種方式來選取執行操做的Minion,它們分別是:

匹配minion_id

這種方式是基於匹配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信息的匹配

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

http://salt.readthedocs.org/en/latest/ref/states/index.html

http://docs.saltstack.com/

http://wiki.saltstack.cn/

相關文章
相關標籤/搜索