庖丁解Puppet之操做記實

庖丁解Puppet之
初級入門篇
node

 

系統環境:
python

軟件包:
mysql

環境安裝:
Puppet 是用ruby語言寫的,因此要安裝ruby環境,服務器端與客戶端都要安裝,我這的環境沒有裝ruby,因此用yum安裝一下。要精細化安裝的話,須要安裝4個包。
[root@testsns ~]# yum –y install ruby*linux

精細化安裝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.rpmnginx

Server端安裝:
一、時間同步
ntpdate time.nist.govsql

二、安裝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 ..shell

[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
三、生成pupput用戶
[root@testsns opt]# puppetmasterd --mkusers
四、啓動
[root@testsns opt]# /etc/init.d/puppetmaster start

apache

Slave端安裝:數組

一、時間同步緩存

ntpdate time.nist.gov

   和服務器端安裝方法同樣,先安裝ruby環境,再安裝facterpuppet,只是在puppet拷貝配置文件時要注意。

二、安裝Facter用來獲取客戶端系統信息(hostname,ip,OS-Version,fqdn)

 

---內容以下
[agent]
Listen = true
Server = testsns
---
[root@nfstest puppet-2.6.13]# vi /etc/puppet/namespaceauth.conf
----內容以下
[fileserver]
allow *
[puppetmaster]
allow *
[puppetrunner]
allow *
[puppetbucket]
allow *
[puppetreports]
allow *
[resource]
allow *
----

三、生成用戶和rra目錄
[root@nfstest puppet]# puppetmasterd --mkusers
四、啓動
[root@nfstest puppet]# /etc/init.d/puppet start
五、修改hosts
   修改雙方的/etc/hosts文件,添加各自的IP地址對應的主機名,生產環境作內部DNS比較好,不用修改每臺服務器的hosts文件。
192.168.133.42 nfstest
192.168.133.44 testsns
六、開放端口
   關閉雙方的防火牆及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端執行命令
puppetd --test --server testsns

執行SHELL命令或shell腳本:
    實例:經過puppet分發執行shell腳本,在客戶端的opt目錄下新建一目錄shelldir。
第一步:編輯Server端的site.pp
vi /etc/puppet/manifests/site.pp

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腳本

第三步:在client端執行命令
puppetd --test --server testsns
在/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" #即第二個星號
}
登陸客戶端查看效果

擴展閱讀:

在開源世界裏,有不少配置工具可供選擇,這個領域一些關鍵的產品有:
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目錄. 你能夠爲你每一個虛擬主機複製一樣的配置代碼.

相關文章
相關標籤/搜索