通過Chef實(shí)現(xiàn)Windows集群的自動(dòng)化配置和管理
但凡服務(wù)器上了一定規(guī)模(百臺(tái)以上),普通的ssh登錄管理的模式就越來越舉步維艱。試想Linux發(fā)布了一個(gè)高危漏洞的補(bǔ)丁,你要把手下成百上千臺(tái)機(jī)器都更新該補(bǔ)丁,如果沒有一種自動(dòng)化方式,那么至少要耗上大半天時(shí)間。雖然你編寫了大量的shell(或python,perl)腳本來實(shí)現(xiàn)各種自動(dòng)化場(chǎng)景,但最后會(huì)發(fā)現(xiàn)你又陷入了腳本的汪洋大海之中,管理和維護(hù)這么多的腳本的成本也不小。你需要一款基礎(chǔ)設(shè)施自動(dòng)化工具,希望它能具有以下功能:
1.批量執(zhí)行
這個(gè)不多說了吧!試想要為每一臺(tái)機(jī)器打補(bǔ)丁的情形吧!
2.任務(wù)編排
現(xiàn)在稍微復(fù)雜點(diǎn)的應(yīng)用都需要N臺(tái)服務(wù)器來部署,而部署的過程中肯定有個(gè)先后的依賴順序。那么由此看來任務(wù)編排肯定必不可少。
3.對(duì)業(yè)務(wù)場(chǎng)景的抽象,也就是DSL化
之所以拋棄自己用shell(或其它語言的)腳本來實(shí)現(xiàn)各種自動(dòng)化的原因之一就是這些腳本很難懂,除了你以外其他人幾乎無法修改。而作為一個(gè)成熟的工具,自然對(duì)咱們復(fù)雜的應(yīng)用場(chǎng)景要做抽象,比如對(duì)服務(wù)器節(jié)點(diǎn)、角色的抽象,對(duì)服務(wù)器上的各種安裝、配置操作的抽象,對(duì)不同環(huán)境的抽象等。通過抽象出來的DSL,大家很容易達(dá)成一致,協(xié)同工作。
4.安全機(jī)制
既然是基礎(chǔ)設(shè)施自動(dòng)化工具,免不了包含各種敏感信息,如何去敏也是挺重要的。而且既然能控制整個(gè)服務(wù)器集群,控制方式也要絕對(duì)安全。
除了這幾個(gè)基本功能以外,當(dāng)然我們還希望有更多功能,比如腳本重用、審計(jì)功能、完善的文檔等。這里就不多說了。
類似的工具肯定已經(jīng)有了,現(xiàn)在市場(chǎng)上比較流行的開源軟件有Puppet、Chef、Ansible、SaltStack等。關(guān)于它們的優(yōu)劣不是這篇文章的重點(diǎn)。
而談起集群管理,大家似乎默認(rèn)的都是對(duì)Linux系統(tǒng)集群的管理,對(duì)于Windows集群則很少涉及。我想這大抵有兩方面的原因,一方面是大部分公司中機(jī)器集群類型大都是Linux系統(tǒng),另一方面是Windows機(jī)器在批量化管理方面天然有缺陷,比如缺乏各種方便的腳本命令、很難對(duì)機(jī)器配置完全腳本化等。但對(duì)Windows集群的管理問題無法回避,因?yàn)樵谄髽I(yè)中Windows集群的確存在。微軟也在致力改善這些問題,比如Window PowerShell就是為了解決校本化的問題。
而筆者的上一個(gè)項(xiàng)目就涉及對(duì)數(shù)百臺(tái)Windows和Linux集群的管理。Windows集群的主要操作系統(tǒng)是Windows Server 2008,Linux集群的主要操作系統(tǒng)是Ubuntu 12.04。要實(shí)現(xiàn)對(duì)這樣的集群的自動(dòng)化配置和管理,筆者積累了一些經(jīng)驗(yàn),特意分享給大家。
一、自動(dòng)化工具的選型
凡是牽扯到工具選型的時(shí)候,如果你發(fā)現(xiàn)你處于一個(gè)非常糾結(jié)的地位,那可能是因?yàn)楦?jìng)品工具沒有一個(gè)能突出重圍,導(dǎo)致你在它們各自的優(yōu)缺點(diǎn)之間難以取舍。我也理解,工具選型要考慮的因素太多。這個(gè)項(xiàng)目的選型其實(shí)沒經(jīng)過太大波折,很快就決定使用Chef。原因我可以簡(jiǎn)單說一下,Puppet的API太不友好,ansible和salt對(duì)windows的支持程度未知,而根據(jù)我以前的經(jīng)驗(yàn),Chef對(duì)windows的支持還是比較成熟的。所以我們就快刀斬亂麻選擇了Chef。
二、搭建Chef生態(tài)環(huán)境
既然決定了Chef,那么接下來很多問題都不得不考慮。
1.使用自建的Chef Server
原因很簡(jiǎn)單,因?yàn)榭蛻舨粫?huì)把自己的node暴露在公共的chef server之上。所以,我們?cè)谄髽I(yè)內(nèi)網(wǎng)搭建了一個(gè)Chef server,放置在一臺(tái)ubuntu機(jī)器上。
2.workstation選擇windows機(jī)器(windows 7)
考慮到我們要同時(shí)管理Linux集群和Windows集群,所以workstation的選擇也很重要。在bootstrap一個(gè)node的時(shí)候,workstation和linux node的通訊方式是ssh,而和windows node的通訊方式是通過WinRM。如果使用Linux通過WinRM和Windows系統(tǒng)通訊,理論上是可行的,我們可以借助一些第三方工具實(shí)現(xiàn),但過程肯定比較曲折。而如果使用Windows機(jī)器和Linux及Windows系統(tǒng)通訊,則沒有太大問題。
3.搭建自己的軟件倉庫
對(duì)于Linux系統(tǒng)而言,有很多成熟的包管理工具,想要安裝什么軟件基本上一條命令即可。而對(duì)于Windows系統(tǒng)而言,雖然有chocolatey之類的工具,但在分發(fā)一些企業(yè)內(nèi)部的軟件方面仍捉襟見肘。所以,我們選擇搭建自己的軟件倉庫。剛開始為了簡(jiǎn)便起見就搭建了一個(gè)ftp服務(wù)器作為軟件倉庫。后期會(huì)考慮遷移到Sonatype Nexus之類能提供更多功能的包管理服務(wù)器上去。
創(chuàng)建Chef repo并納入源代碼管理之類的事情由于沒有太多特殊性,所以這里就不展開了。
二、應(yīng)用Chef管理windows集群
使用Chef來管理windows集群肯定沒有像管理Linux集群那么容易,以下是幾個(gè)需要注意的點(diǎn)。
1.配置Windows node開啟WinRM服務(wù)
WinRM服務(wù)是微軟提供的用于進(jìn)行遠(yuǎn)程通訊的服務(wù)(Windows 7及以后的系統(tǒng)內(nèi)置支持),你可以簡(jiǎn)單理解為Windows版的SSH。在Windows server 2008 R2操作系統(tǒng)中,WinRM服務(wù)默認(rèn)是關(guān)閉的,我們需要啟用它。首先需要修改兩個(gè)組策略。在組策略的計(jì)算機(jī)配置->策略->Windows組件->Windows遠(yuǎn)程管理(WinRM)->WinRM服務(wù)中,選擇“允許自動(dòng)配置監(jiān)聽器”,把該策略選為啟用,并修改IPv4和 IPv6過濾器為*。然后在控制面板中選擇Windows防火墻,單擊例外選項(xiàng)卡,選擇Windows遠(yuǎn)程管理復(fù)選框。如果看不到該復(fù)選框,請(qǐng)單擊添加程序以添加 Windows 遠(yuǎn)程管理。 (具體請(qǐng)參見http://www.briantist.com/how-to/powershell-remoting-group-policy/)
這兩項(xiàng)的配置也可以通過PowerShell腳本來實(shí)現(xiàn)。想要了解的可以參見這篇文章https://powertoe.wordpress.com /2011/05/16/enable-winrm-with-group-policy-but-use-powershell-to-create- the-policy/。
然后就可以啟用和配置WinRM了。只需要在PowerShell終端輸入winrm quickconfig -q即可。另外Chef還推薦對(duì)WinRM進(jìn)行一些進(jìn)階配置,具體請(qǐng)參見https://github.com/Chef/knife- windows#requirementssetup。
2.使用windows cookbook
windows cookbook是Chef專為windows平臺(tái)寫的cookbook。里面包含了非常多的針對(duì)windows平臺(tái)特性的功能,是操縱windows平臺(tái)不可或缺的利器。比如解壓縮文件、執(zhí)行batch(PowerShell)命令、安裝認(rèn)證、安裝卸載windows包、配置執(zhí)行計(jì)劃任務(wù)……
使用方式也很簡(jiǎn)單,安裝可以通過chef的supermarket執(zhí)行,具體參見https://supermarket.chef.io /cookbooks/windows#knife。如果在其它c(diǎn)ookbook需要使用該cookbook的模塊,只需在其它c(diǎn)ookbook的metadata.rb中加入depends ‘windows’即可。
3.升級(jí)Windows node上的PowerShell版本
PowerShell之于Windows就相當(dāng)于shell之于Linux。Windows Server 2008 R2上的PowerShell默認(rèn)版本是3.0,最好能夠升級(jí)到高級(jí)版本。而https://github.com/opscode-cookbooks /powershell中的cookbook則可以方便的對(duì)Windows node的PowerShell進(jìn)行升級(jí)和配置,以及安裝各種PowerShell module,執(zhí)行PowerShell腳本等。
4.實(shí)現(xiàn)對(duì)軟件的靜默安裝
Linux上的每種軟件基本都有通過命令行靜默安裝的方式。而Windows下的軟件卻不盡然。如果軟件是以.msi方式打包的,那么可以使用Windows Installer來實(shí)現(xiàn)靜默安裝。如果是以.exe的方式來打包的,倒也不必驚慌,可以仔細(xì)分析其是否是以inno、NSIS、 installshield等方式打包的,然后根據(jù)各自方式的靜默方式實(shí)現(xiàn)自動(dòng)化安裝。如果以上皆不適用,則可以分析該軟件是否為綠色軟件,嘗試把安裝后的整個(gè)文件夾打包放置于軟件倉庫之上,以后安裝只需要解壓縮即可。如果軟件既沒有規(guī)范的打包方式,也不是綠色軟件,那么就比較麻煩了,需要分析安裝后創(chuàng)建了那些文件,以及執(zhí)行了那些腳本,然后嘗試把這些操作命令行化(不過這樣的軟件非常少,不必過于擔(dān)心)。
5.使用push jobs功能
通常我們需要對(duì)節(jié)點(diǎn)進(jìn)行批量化操作,而通過chef-client的方式功能有限。chef提供了push jobs這樣的擴(kuò)展功能,允許我們對(duì)節(jié)點(diǎn)進(jìn)行隨心所欲的批量操作。詳情請(qǐng)參見https://docs.chef.io/push_jobs.html。
6.熟練使用PowerShell腳本
之前我說過,PowerShell在Windows上的地位就如同Shell在Linux上的地位。Windows PowerShell提供了對(duì)COM組建和WMI組件的完全訪問,而且可以輕松調(diào)用.net framework框架中的功能,而且也包含強(qiáng)大的文檔。如果你想配置一個(gè)DHCP服務(wù)器,或者配置一個(gè)IIS網(wǎng)站服務(wù),抑或修改注冊(cè)表,使用PowerShell能輕松讓你達(dá)到目標(biāo),徹底擺脫圖形化界面。
總體來說,Chef對(duì)于Windows平臺(tái)的支持力度還是相當(dāng)完善的,如果你想實(shí)現(xiàn)對(duì)Windows集群的自動(dòng)化管理,那么Chef不失為一種可行的方案。至于其它幾種自動(dòng)化工具,筆者有時(shí)間也會(huì)進(jìn)行深入調(diào)研,再出具報(bào)告。