Salt Stack 初探 之 另外一種用 Python 寫的配置管理系統

發表於2016-01-26

不久前的一天,當我自豪穿著Salt Stack 文化衫的時候,我的女兒看到後就當面問我,“Salt Stack 是什麼呀?” 於是,我開始了作出瞭如下的解釋,假如你有很多臺伺服器而且想要操作這些伺服器,你也許需要一臺一臺的登入這些伺服器,每次作出一次操作變更。這些操作可能是相當簡單的,比如重啟他們或者檢查他們已經執行了多久,更或者,你想要做些更復雜的事情,比如安裝軟體和按照你的特殊需求來配置他們,也許你只是想要增加使用者並且配置他們的許可權。

假如你有百十來臺伺服器,你應該怎麼做?想象一下你每次一臺一臺的登陸這些伺服器,執行同樣的命令在這些100臺的伺服器中並且編輯同一個配置檔案,你可以想象嗎?這是多麼的苦逼!僅僅更新一下使用者的密碼策劃就要用掉數天的時間,並且你可能出現錯誤的操作,怎麼樣通過一個命令一次完成所有伺服器的操作?怎麼解決?答案就是,Salt Stack!

 

和我女兒一樣,你也許還沒有聽說過Salt Stack(http://saltstack.org),但是你可能比較熟悉Puppet((http://puppetlabs.com))和Chef(http://opscode.com).Salt 跟他們差不多,但是Salt 是用Python寫的,且對於裝置的要求是相當輕量級的,使用起來相當容易(在我看來),Salt 通訊層使用0MQ(http://www.zeromq.org),這是使得它很快速。並且它是完全開源的,遵守Apche2 (http://www.apache.org/licenses/LICENSE-2.0)開源協議.擁有一個活躍和高效的開源社群。

目前,他們沒有任何計劃來釋出一個殘缺的社群版本或一個功能豐富的商業版本,對於Salt,你當前獲得的這個版本是任何人都可以獲得的,不論你是否付過錢。當然他們有發行商業版本的計劃,不過它將是緊密的社群版本,且通過更多的測試和質量保證,以及相關的培訓。

Salt和Puppet Chef 一樣可以讓你同時在多臺伺服器上執行命令也包括安裝和配置軟體。Salt 有兩個主要的功能:配置管理和遠端執行。

Salt Stack 是一個命令列工具,這裡沒有任何地方需要你點選你的滑鼠,執行的結果也會像字元介面一樣反饋到你的螢幕上。這很好吧,它使得事情變得簡單,並且很多伺服器不需要一個圖形介面。(註解:我使用Salt 條款在本文中,他們指的是同一個東西在上下文中)

在本文,Salt 包含兩個工具,第一個是遠端執行,雖然沒有一個清晰的描述,但是假如你想要一個配置管理和遠端執行的工具,在Salt中你可以找到很多方法。這可以讓你登陸一臺主伺服器然後同時執行命令在一臺或者多臺伺服器上。使用Salt,你僅僅需要在主伺服器上輸入命令,它會在每臺機器上甚至一個伺服器群組執行。

第二,Salt 能夠儲存配置指令,然後引導其他機器按照這些指令作出動作,如,安裝軟體,更改軟體的配置,反饋這個任務成功執行與否。

接下來,我來演示使用Salt 安裝一個額外的包,並且僅僅通過一個命令配置這個包。

 

安裝 Salt

Salt 是不斷變更的,也許當你讀到本文時,有些事情已經改變,你可以在這裡找到最新的文件:

http://docs.saltstack.org/en/latest/index.html

在安裝Salt之前,你需要一些簡單的準備工作:

1,一臺Linux 伺服器

2,sudo 或者root密碼

3,這臺伺服器能夠連線因特網

4,知道你的伺服器的IP地址(可以是公網或私網IP)。

雖然Salt被設計為能夠連線多臺伺服器,但在本文中,你可以在一臺伺服器上完成這些操作。

使用你的包管理器來安裝Salt,你可以根據你係統版本分支找到相關的安裝手冊(http://docs.saltstack.org/en/latest/topics/installation/index.html),你也需要sudo或者root許可權,來安裝和使用salt

使用包管理的好處或者從線上的原始碼安裝是一個無法結束的爭論,根據你的系統版本分支,選擇更好的安裝方法。

假如你傾向於使用原始碼來安裝,你可以在Salt 專案Github版本庫裡找到最新的Salt原始碼檔案(https://github.com/saltstack/salt).

安裝完成Salt-master和salt-minion後,希望一切執行正常且你沒有收到錯誤資訊。假如Salt並沒有正常執行,你可以在到Salt Stack的郵件列表(http://saltstack.org/learn/#tab-mailinglist)和Salt IRC頻道尋求幫助。

配置主伺服器和從伺服器

主伺服器和從伺服器指的是控制器和被控制的伺服器,這個主伺服器本質上是中央協調中心對所有的從伺服器,從伺服器類似client/server配置,這裡的主伺服器是server,從伺服器是client.

從伺服器配置

在本文中,我配置salt-master和salt-minion 命令在同一臺機器上,假如你在配置多臺伺服器,挑選其中一個為master,剩下的成為minions.根據你的需要來配置master和minion,接下來的我會解釋如何配置一臺伺服器為master和另外的機器為minions.

Salt的配置檔案在/etc/salt目錄下,預設,這些檔案被命名為minion和master,假如你在同一臺機器安裝了salt-master和salt-minion,你會看到不同的兩個檔案,master和minion

首先,你需要告訴你的minion怎樣找到並連線你的Master伺服器。即使你執行minion和Master在同一臺伺服器上,你仍然要告訴minion你的master在哪兒。

1,使用你最喜歡的文字編輯器,開啟minion配置檔案

2,取消註釋行#master,移除# 替換為你的Master伺服器的IP地址,應該是這樣:master:你的master IP地址。(假如以上操作,在同一臺伺服器,此時增加 127.0.0.1)

3,命名一個暱稱給你的伺服器,查詢到#id行,再一次移除#號,增加一個nameid:1st-salt-minion,(這個名字可以是任何字串的)

4,為了重新載入新的配置,你需要使用sudo 重啟你的salt-minion程式,-d 選項,啟動salt-minion為一個後臺程式,這樣子的話,你可以訪問您的命令列釋出更多的命令。

認證 Minion Keys

現在你的minion 已經知道到master在哪裡,接下來讓他們進行彼此驗證,Salt使用公共金鑰加密來確保master和minions的安全通訊。你需要通過在master端驗證minion的證照來明確master和minion之間的是授信的。

認證minion的證照使用salt-key命令,Salt自動生成這些證照,你需要做的僅僅是認證你需要的證照。

1,輸入salt-key -L 列出所以沒有認證,認證過,拒絕認證的證照

2,你應該可以看到一個沒有認證的證照1st-Salt-Minion(或者你自己選擇的minion)

3,認證這個證照使用 sudo salt-key -a 1st-salt-minion

通訊測試

現在你已經有了一臺 salt-master和一臺salt-minion,並且master和minion已經相互信任,你可以從master 使用一個test ping的命令來測試他們之間的連線。假如你的master能夠連線到minion,將會返回一個”return”.輸入 salt ‘*’ test.ping,它應該有如下輸出:

注意,萬用字元 *代表所有minion,因為這裡你只有一臺伺服器,算是一個簡單的模擬測試(要比salt ‘1st-salt-Minion’ test ping 快多了)

假如你收到“True”,證明你已經成功安裝和配置完成salt stack。

如果沒有的話,你也許需要重啟你的master和minion 不帶-d引數,這樣子的話,你能夠獲取到更多輸出資訊,更多的參考資料,請檢視Salt 官方文件http://docs.saltstack.org/en/latest/topics/configuration.html

Salt的語法結構,包括命令,目標和動作,舉個例子,* 指任何主機(* 是一個萬用字元),test.ping 是動作。

你可以在已經連結和信任的主機上執行任何可用的命令,關鍵提示:這些需要執行的命令在目標主機上必須可用,例如,如下命令:

這個命令只會在已經安裝了apach2e web伺服器的主機上執行,另外,你也可以使用這樣的命令:

另外一個例子,也許你想要查詢你的主機已經執行了多長時間,你可以這樣子做:

在舉另外一個例子,假如你的Apache Bench(譯者注:一個apche 開源壓力測試工具)安裝在master上而沒有安裝在minion上,下面的命令:

如果你嘗試在minion上執行,你將會失敗,因為Apache Bench 沒有安裝在minion上。

在這裡一切皆有可能,你可以在一個終端中一次重啟你所有的機器,升級系統軟體或者是檢查你的機器狀態,而不是像以前一樣登陸這些機器一遍一遍的執行這些命令。

你也可以根據你自己的需求,執行一些命令在特定的目標群組上。參考-G 引數,從官網文件中獲取更多細節http://saltstack.org

從此以後你不需要再登陸minion,所有的配置和執行能夠快速高效的遠端執行。

既然你已經安裝了Salt並且能夠執行一些遠端的命令,為什麼停步於此那?第二部分,Salt的強大源自於配置管理工具。

配置管理

假如你之前沒有使用過其他的配置管理系統,下面是一個簡單的例子,比如說你有一組配置和相關的包,需要安裝在每個WEB伺服器上。你保留這些配置指令在一個文字檔案中,然後引導你的伺服器以你需要的方式安裝和配置他們,每次你建立一個新的伺服器。你也可以使用配置管理來保持你所有的伺服器更新,一旦他們被創造和變化的反饋到新的包裝或配置

安裝了lib pam-crack 包,你可以有新增額外的要求使用者密碼。之所以選擇這個包,是因為它對所有連線到因特網的伺服器是有用的。它允許你設定一個額外長度的密碼,並且會要求你密碼中包含特殊字元或者數字,你也可以比較容易的選擇特殊的包。但是這些包和例子必須在你的系統中可用。

配置指令的儲存

一般來講,Salt的配置管理指令和檔案儲存在/srv/salt目錄下,這裡存放著所有的配置檔案,和一些你想要拷貝到從伺服器的檔案。Salt的特點之一是包含一個檔案伺服器。雖然Salt不會在你的主伺服器建立系統檔案,但是所有的配置管理髮生在/srv/salt目錄中。

預設,Salt使用PyAMl語法(http://pyyaml.org作為它的模板檔案的格式,但是其他很多模板語言在Salt中是可以使用的。一定要按照正確的格式書寫YAML,比如它使用到兩個空格代替tab。如果YAML檔案出現不可預知的錯誤,你可以使用一個線上的debug工具(http://yaml-online-parser.appspot.com)。

啟動配置管理

在啟動配置管理功能之前,你需要再一次編輯你的master配置檔案,在/etc/salt下。開啟master配置檔案,找到file_roots行,預設配置檔案中,這一行在第156行。現在,取消註釋即刪除#號,配置如下:

這樣子就可以告訴Salt你的配置管理檔案在哪裡。根據你是如何安裝Salt,有時你需要自己建立/srv/salt目錄

建立一個Top檔案/Roadmap

基礎配置檔案也叫做Top檔案,在/srv/salt目錄下。我們來建立這個檔案。這個檔案提供了其它檔案的對映。可以用於作為其它伺服器的基礎配置檔案。再次使用你最喜歡的編輯器,在/srv/salt目錄建立一個top.sls檔案。你可以把它作為指向不同目錄的路線圖。在top.sls中加入一下行:

base語法告訴Salt這是基礎配置檔案,可以應用在所有機器上。萬用字元’*’的目標是所有機器。’- servers’指令可以是任意值,執行你識別哪些質量可以使用。再選擇一些其它有用的配置。這個條目還指向一個特別的配置,用於安裝libpam-cracklib。

建立一個特定伺服器的配置檔案

儲存top.sls後,在/srv/salt目錄下建立servers.sls檔案。這個檔案包含特定的配置,包括安裝包的名稱,也可指向另外的配置檔案。在servers.sls中,加入如下行:

第一行是包管理工具可識別的軟體包名稱。以Apache HTTP server為例,在基於apatitude的包管理中叫做apache2,而在基於yum的包管理中叫做httpd。確保針對包管理工具使用正確的名字。也可以使用Salt的grains進行包管理。檢視參考文件以獲得更多資訊,以及在SLS檔案使用grains的例子(http://salt.readthedocs.org/en/latest/topics/tutorials/states_pt3.html#using-grains-in-sls-modules).

第2和第3行告訴Salt如何處理這個包——本例是安裝這個包。要刪除一個包,你只需要修改’- installed’為’- removed’即可。記住,空格很重要!第二行’pkg:’前有兩個空格,第三行’- installed’前有四個空格。如果遇到任何錯誤,請通過線上YAML解析器檢查語法。

 

特定包的配置檔案

安裝libpam-cracklib包,你僅僅需要寫三行配置即可。到此時的話,預設包管理器會安裝libpam-cracklib包。然後您將需要登入到計算機上安裝和配置它為您的特定需求。即使安裝失敗,Salt也會提供一個好的方案來解決。

Salt作為一個安全檔案伺服器,並把檔案拷貝到遠端的從伺服器上。在servers.sls增加如下行:

注意第四行,它告訴Salt你的特殊檔案的位置,這一行後面的行,即第5行,告訴Salt這個包的依賴包。

這行salt://對映到你的主伺服器/srv/salt目錄。

儲存了server.sls檔案後,在/srv/salt 目錄下建立servers目錄。這裡用來儲存libpam-cracklib包的配置檔案。

當你在安裝軟體和配置檔案的時,有時候你想要在測試伺服器上先行安裝,然後以你的需要配置。你可以拷貝配置檔案到/srv/salt目錄,這樣子,你可以在部署到生成環境之前測試他們。

現在你的配置測試通過,現在你可以把配置檔案隨著安裝libpam-cracklib 分發到每天從機器上了。/srv/salt 目錄應該如下:

這裡我把libpam-cracklib的配置作為一個例子,所有的其他軟體配置都和這樣差不多。例如,你可以比較容易的通過修改httpd.conf 來實現虛擬主機和主機頭的配置。

所有的sls檔案準備好以後,最後一步是告訴Salt配置遠端機器。state.highstate 是觸發這些同步的命令。使用先前的語法格式,目標位所有機器,鍵入以下格式的命令:

片刻後,從服務會反饋像如下成功的資訊:

如你所見,Salt成功安裝了libpam-cracklib並且從主伺服器下載了一個common-password到從伺服器的/etc/libpam-cracklib 目錄。

本例中只有一臺從伺服器,相對來說是一個簡單的例子,但是想象一下,假如你使用Salt配置管理安裝了LAMP web伺服器,你省了多長時間呀。把這些配置放在文字檔案中,使得你快速高效的建立同樣的伺服器。

總結

現在你有能力一次在很多臺機器上執行遠端命令並且能夠把配置檔案儲存在易維護的文字中。也可以安裝特殊的軟體包。

剛開始的時候,多花點心思。您可以根據自己的特定配置建立一個或多個伺服器,並且下載不同的包到每臺機器上。Salt 也可以不按順序執行,有些命令會同時執行,假如其中一臺執行失敗,其他依然不受影響繼續執行。

雖然在安裝Salt比較費時,但是你以後會得到極大的好處,特別是可以讓你建立特定的伺服器和可重複使用的配置。

訪問Salt專案得到更多的細節,多關注郵件列表和使用者文件以及一些例子。你會發現社群會非常熱心的幫助你處理問題。

相關文章