庖丁解Puppet之
初級入門篇
系統環境:
<a href="http://blog.51cto.com/attachment/201202/173614191.jpg" target="_blank"></a>
軟體包:
<a href="http://blog.51cto.com/attachment/201202/173632809.jpg" target="_blank"></a>
環境安裝:
Puppet 是用ruby語言寫的,是以要安裝ruby環境,伺服器端與用戶端都要安裝,我這的環境沒有裝ruby,是以用yum安裝一下。要精細化安裝的話,需要安裝4個包。
[root@testsns ~]# yum –y install ruby*
精細化安裝Ruby環境
1.puppet是基于ruby開發。是以要安裝ruby語言環境。
找到相應版本對應的ruby的rpm包(下以redhat 5.4為例)
rpm –ivh ruby-libs-1.8.5-5.el5_2.3.i386.rpm
rpm –ivh ruby-1.8.5-5.el5_2.3.i386.rpm
2.Rdoc的安裝。
如果需要檢視幫助文檔,需要安裝此包。有一點特殊說明,此包在AS4上未找到相關的rpm。是以建議服務端使用5.0以上的版本。
rpm –ivh ruby-irb-1.8.5-5.el5_2.3.i386.rpm
rpm –ivh ruby-rdoc-1.8.5-5.el5_2.3.i386.rpm
Server端安裝:
1、時間同步
ntpdate time.nist.gov
2、安裝Facter用來擷取用戶端系統資訊(如hostname,ip,OS-Version,fqdn等)
[root@testsns opt]# tar zxvf facter-1.6.5.tar.gz
[root@testsns opt]# cd facter-1.6.5
[root@testsns facter-1.6.5]# ruby install.rb
[root@testsns facter-1.6.5]# cd ..
[root@testsns opt]# tar zxvf puppet-2.6.13.tar.gz
[root@testsns opt]# cd puppet-2.6.13
[root@testsns puppet-2.6.13]# ruby install.rb
[root@testsns puppet-2.6.13]# cp conf/auth.conf /etc/puppet/
[root@testsns puppet-2.6.13]# cp conf/redhat/fileserver.conf /etc/puppet/
[root@testsns puppet-2.6.13]# cp conf/redhat/puppet.conf /etc/puppet/
[root@testsns puppet-2.6.13]# cp conf/redhat/server.init /etc/init.d/puppetmaster
[root@testsns puppet-2.6.13]# chmod +x /etc/init.d/puppetmaster
[root@testsns puppet-2.6.13]# chkconfig --add puppetmaster
[root@testsns puppet-2.6.13]# chkconfig puppetmaster on
[root@testsns puppet-2.6.13]# mkdir -p /etc/puppet/manifests
3、生成pupput使用者
[root@testsns opt]# puppetmasterd --mkusers
4、啟動
[root@testsns opt]# /etc/init.d/puppetmaster start
Slave端安裝:
ntpdate time.nist.gov
和伺服器端安裝方法一樣,先安裝ruby環境,再安裝facter和puppet,隻是在puppet拷貝配置檔案時要注意。
---内容如下
[agent]
Listen = true
Server = testsns
---
[root@nfstest puppet-2.6.13]# vi /etc/puppet/namespaceauth.conf
----内容如下
[fileserver]
allow *
[puppetmaster]
[puppetrunner]
[puppetbucket]
[puppetreports]
[resource]
----
3、生成使用者和rra目錄
[root@nfstest puppet]# puppetmasterd --mkusers
[root@nfstest puppet]# /etc/init.d/puppet start
5、修改hosts
修改雙方的/etc/hosts檔案,添加各自的IP位址對應的主機名,生産環境做内部DNS比較好,不用修改每台伺服器的hosts檔案。
192.168.133.42 nfstest
192.168.133.44 testsns
6、開放端口
關閉雙方的防火牆及selinux,或開放8140(server伺服器端口),8139(client伺服器端口)。互相作ping hostname telnet hostname 8140 test hostname 8139等,看網絡及hosts是否正常
認證:
用戶端發送請求
Puppeted --test –server testsns
伺服器檢視
Puppetca –list
伺服器端簽名
Puppetca –s –a //對所有用戶端全部簽名
Puppetca –s nfstest //隻簽名某個用戶端
功能子產品介紹及執行個體操作
檔案分發:
通過puppet可以向被管理機上推送檔案,方法是使用file類型的source屬性
1:修改/etc/puppet、fileserver.conf
2:修改/etc/puppet/manifests/ site.pp
執行個體:要把server伺服器上/opt目錄下的mysql-5.1.49-linux-i686-icc-glibc23.tar.gz傳輸至client伺服器的/opt目錄下,檔案名不變。
第一步:Vi /etc/puppet/fileserver.conf
[files]
path /opt/
allow 192.168.133.0/24
第二步:vi /etc/puppet/manifests/site.pp
file
{ "/opt/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz":
source => "puppet://$puppetserver/files/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz",
}
第三步:
在client用戶端執行更新指令
puppetd --test --server testsns
此處“$puppetserver”是puppet Server端的名稱,即hostname,網上教程都是在hosts裡指定,生産環境下用内部的DNS上作解析,像我公司一個www平台就有70台linux伺服器,一個個添加hosts,不搞死人去。
修改檔案屬性:
執行個體:把/tmp/dd142/ puppet-2.6.13.tar.gz檔案的權限改為puppet使用者,并設定權限為666。
第一步:編輯Server端的site.pp
vi /etc/puppet/manifests/site.pp
file
{ "/tmp/dd142/puppet-2.6.13.tar.gz":
owner => "puppet",
group => "puppet",
mode => 666,
第二步:在client端執行指令
執行SHELL指令或shell腳本:
執行個體:通過puppet分發執行shell腳本,在用戶端的opt目錄下建立一目錄shelldir。
exec { "exec-mkdir":
cwd => "/opt",
command => "sh /opt/lgh.sh",
user => "root",
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
第二步:在client端編輯一shell腳本
<a href="http://blog.51cto.com/attachment/201202/174254980.jpg" target="_blank"></a>
第三步:在client端執行指令
在/opt目錄下檢視shelldir有沒有建立。
服務檢查及修改:
可以通過puppet對一些服務進行檢查。puppet是通過service指令操作的。是以,隻能針對在/etc/init.d/目錄下的服務
執行個體:把用戶端的防火牆起來(原來是關閉的)
vi /etc/puppet/manifests/site.pp //清空site.pp,再建立
service
{ iptables:
ensure => "running",
cron計劃任務:
接上面的shell程式執行個體,在17:30執行/opt/lgh.sh。
cron { "cron-shell": #title部分,可用來作為注釋。
command => "sh /opt/lgh.sh" #要執行的指令
user => "root", #添加到root使用者下的crontab中
minute => "30", #即第一個星号
hour => "17" #即第二個星号
登入用戶端檢視效果
<a href="http://blog.51cto.com/attachment/201202/174126206.jpg" target="_blank"></a>
擴充閱讀:
在開源世界裡,有很多配置工具可供選擇,這個領域一些關鍵的産品有:
Puppet(http://puppet.reductivelabs.com/):
Ruby寫成的配置管理工具,使用C/S架構,使用declarative language配置用戶端。
Cfengine(http://www.cfengine.org):
最先釋出的開源配置工具之一,1993年釋出,同樣是C/S架構,通常應用于教育機構。
LCFG(http://www.lcfg.org/):
C/S架構的配置管理工具,使用XML定義配置。
Bcfg2
Python編寫的C/S架構的配置管理工具,使用規格書和客戶機響應配置目标主機。
本文檔緻力于描述使用Puppet管理你的主機、應用程式、背景程式和各種服務。
在此隻講Puppet,因為它簡單,強大,流行。
什麼是puppet?
puppet是一種Linux、Unix平台的集中配置管理系統,使用自有的puppet描述語言,可管理配置檔案、使用者、cron任務、軟體包、系統服務等。puppet把這些系統實體稱之為資源,puppet的設計目标是簡化對這些資源的管理以及妥善處理資源間的依賴關系。
puppet采用C/S星狀的結構,所有的用戶端和一個或幾個伺服器互動。每個用戶端周期的(預設半個小時)向伺服器發送請求,獲得其最新的配置資訊,保證和該配置資訊同步。每個puppet用戶端每半小時(可以設定)連接配接一次伺服器端, 下載下傳最新的配置檔案,并且嚴格按照配置檔案來配置伺服器. 配置完成以後,puppet用戶端可以回報給伺服器端一個消息. 如果出錯,也會給伺服器端回報一個消息.
為什麼要開發puppet
系統管理者都喜歡自己寫點小工具來讓自己的工作完成的更快或者更好, 不管是在大企業管理大量的伺服器還是隻管理兩三台機器. 但是很少人會把他們的工具釋出出來. 也就是是說極少有工具能被重用,或者說很多工具就隻能在所在的組織内部有用.拷貝給别的組織,他們也用不上. 也就是說,每個系統管理者,在一個新的公司,都會另起爐竈開發一套基于ssh,for循環的"系統"來幫助自己完成系統管理任務.
開發puppet是為了讓系統管理者可以互相交流和共享成熟的工具,避免重複的勞動.通過以下兩個特性來實作這一目标:
提供一個簡潔的但是強大的架構來完成系統管理任務
系統管理任務可以描述成puppet語言,是以可以互相分享代碼,就像分享其他語言的代碼一樣,比如python, c等
是以,作為系統管理者的你可以更快的完成工作,因為你可以用puppet來處理所有的管理細節. 甚至你還可以下載下傳其他管理者的puppet代碼來讓你的工作完成的更快.
使用puppet 的穩定性
puppet與其他手工操作工具有一個最大的差別就是 puppet的配置具有穩定性,是以你可以多次執行puppet, 一旦你更新了你的配置檔案,puppet就會根據配置檔案來更改你的機器配置,通常每30分鐘檢查一次. puppet會讓你的系統狀态同配置檔案所要求的狀态保持一緻. 比如你配置檔案裡面要求ssh服務必須開啟. 假如不小心ssh服務被關閉了,那麼下一次執行puppet的時候,puppet會發現這個異常,然後會開啟 ssh 服務. 以使系統狀态和配置檔案保持一緻.puppet就象一個魔術師,會讓你的混亂的系統收斂到puppet配置檔案所想要的狀态.
可以使用puppet管理伺服器的整個生命周期,從初始化到退役.不同于傳統的例如sun的Jumpstart或者redhat的Kickstart, puppet可以長年讓伺服器保持最新狀态.隻要一開始就正确的配置他們,然後再也不用去管他們.通常puppet使用者隻需要給機器安裝好puppet并讓他們運作,然後剩餘的工作都由puppet來完成.
puppet的細節和原理
puppet的目的是讓你隻集中于你要管理的目标,而忽略實作的細節,例如指令名,參數或者檔案格式. puppet把系統裡面的使用者,軟體包,服務 看作是"資源", puppet的作用就是管理這些資源以及資源之間的互相聯系.
底層支撐工具 Providers,puppet有很多的資源類型,例如檔案,使用者,軟體包,服務, 不同的作業系統上對資源的管理指令是不一樣的,例如debian下面用apt-get安裝軟體,redhat下面用yum安裝軟體. 是以puppet 對同一資源的管理可以有多個實作,配置資源的時候,可以明确的指定用什麼provider. 例如在redhat上配置一個package資源的時候,可以指定provider是yum.
Facter變量
在puppet用戶端分析代碼的時候,會把從facter傳送過來的對應的值指派給變量. 你可以單獨手工執行facter這個指令,這個指令會列印出它所收集到的關于主機的資訊,例如ip位址等等. facter把收集到值發送給puppet伺服器端,伺服器端就可以根據不同的條件來對不同的節點機器生成不同的puppet配置檔案. 最重要的一個就是伺服器的主機名.
工作方式與流程
puppet既可以在單機上使用,也可以以c/s結構使用.在大規模使用puppet的情況下,通常使用c/s結構.在這種結構中puppet用戶端隻是指運作puppet的伺服器,puppet伺服器端是隻運作puppetmaster的伺服器.
puppet用戶端首先會連接配接到puppet伺服器端,并且通過facter工具把用戶端的基本配置資訊發送給伺服器端. 伺服器端通過分析用戶端的主機名,通過node 定義,找到該主機的配置代碼,然後編譯配置代碼,把編譯好的配置代碼發回用戶端,用戶端執行代碼完成配置.并且把代碼執行情況回報給puppet伺服器端.
修改系統配置
puppet 通過管理資源的方式來管理系統, 例如管理某個軟體是否要安裝,是安裝最新的還是安裝了就行. 管理某個服務是否開啟, 管理某個檔案的屬性,内容等等. 所有的資源都有對應的幾個屬性可以設定. 通過設定屬性的方式來管理資源. 有一種特殊的屬性可以用在所有的資源上面,這種屬性叫做 metaparams ( 元參數或者元屬性).
資源之間的關系
支援資源之間的關系配置是puppet的關鍵特性之一. 一個資源的變更可以對另一個資源産生一個動作.例如 /etc/apache.conf這個資源有改動,可以讓/etc/init.d/apache 這個資源 reload一下.假如一個資源依賴另一個資源,那麼puppet會優先配置被依賴的資源,是以如果你的配置檔案沒有準備好,對應的服務是不會先啟動的.
puppet 語言資源
puppet的全部就是管理資源,是以puppet語言的焦點就是處理這些資源,下面是一個基本的管理單個資源的例子.
file {"/etc/hosts": owner = root, group = root, mode = 644}
上面的列子給出了定義一個資源所需要的所有元件,類型,名字和屬性. 定義了一個 file 資源, 資源的title(标題)是 "/etc/hosts", 資源的屬性裡面設定了該檔案屬于那個使用者群組,以及檔案的權限.
也可以在一個大括号裡面定義多個資源,通過分号來區分.
避免重複配置
puppet的編譯器會避免在不同的代碼段裡面管理同一個資源, 如果在不同的代碼段對同一個資源進行配置,執行puppet的時候你會得到一個文法錯誤.puppet探測這種沖突的情況是通過判斷資源類型和資源的title(标題); 如果兩個資源有相同的資源類型和title; 那麼就認為這兩個資源是表示同一個資源.
類
你可以把多個相關的資源定義在一起,組成一個類.可以在其他的代碼段include這個類.puppet還支援有限制的類的繼承,作用就是在子類裡面的屬性可以覆寫父類裡面的屬性.
字元串
幾乎所有的東西和符号在puppet裡面都被看作是字元串,包括數字和布爾值. 但是如果你用引号把true和false引起來,他們會被當做字元串,例如你想指派給某個資性"yes"的 字元串.
變量
puppet除facter變量外,也可以自定義變量,但不允許你在同一個類裡面對一個變量進行兩次指派.
$myvar = value123
條件語句
Puppet支援常見的條件語句,使得你能根據不同的條件導入不同的資源定義。如if、case、另外puppet從版本0.24.6開始支援比較運算符。
數組
puppet 非常有限的支援數組這種類型,你可以建立數組,并且給他們指派,但是你不能删除它們.數組用的最多的情況就是上面ssh例子裡面,資源依賴哪種情況. 或者是一次管理多個相同類型的資源.例如:user { [bin, adm]: ensure => present }
函數
puppet提供一些有用的函數,例如template利用erb模闆來生成檔案内容,這樣就可以根據不同主機的情況,生成不同的配置檔案.例如配置squid的記憶體緩存大小,可以利用facter傳回的記憶體值做一個簡單的數學計算,然後寫入到squid的配置檔案,就是通過template來完成的. 另外一個函數include 可以讀入另外的puppet配置檔案或者類.這樣可以把puppet的檔案分割的更有規律.
節點
最後一個關于puppet語言的文法是節點定義"node", 節點定義很象類定義,也支援繼承特性. 當一個節點(puppet用戶端)連接配接到puppet伺服器端,puppet解析器會查找這個節點的node代碼片斷,然後利用這個代碼片斷來生成該用戶端的配置代碼. puppet裡面主機名來标明一個主機,是以主機名在puppet裡面相當重要. 如果puppet找不到比對該主機名的node定義,就會用預設的節點定義來配置該主機. 在node裡面使用主機名,需要用單引号把主機名括起來.
node 'server1' { include nginx }
在上面的代碼中,如果server1這個主機連接配接到puppet伺服器,puppet伺服器就會按照nginx的代碼來配置這台伺服器.
自定義資源
puppet裡面有一個非常有用的文法結構,叫做define, 通過define可以把多個資源包裝成一個資源,或者把一個資源包裝成一個模型,便于使用.例如,在debian裡面管理一個apache虛拟機非常簡單,把一個虛拟主機的配置檔案放到/etc/sites-available/裡面,然後做一個符号連結到/etc/sites-enabled目錄. 你可以為你每個虛拟主機複制同樣的配置代碼.
本文轉自itwork 51CTO部落格,原文連結:http://blog.51cto.com/369369/785895,如需轉載請自行聯系原作者