puppet是一種Linux、Unix平臺的集中配置管理系統,使用ruby語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。puppet把這些系統實體稱之爲資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。html
Puppet是一個C/S架構的配置管理工具,在中央服務器上安裝puppet-server軟件包(被稱做Puppetmaster)。在須要管理的目標主機上安裝puppet客戶端軟件(被稱做PuppetClient)。當客戶端鏈接上Puppetmaster後,定義在Puppetmaster上的配置文件會被編譯,而後在客戶端上運行。每一個客戶端默認每半個小時和服務器進行一次通訊,確認配置信息的更新狀況。若是有新的配置信息或者配置信息已經改變,配置將會被從新編譯併發布到各客戶端執行。也能夠在服務器上主動觸發一個配置信息的更新,強制各客戶端進行配置。若是客戶端的配置信息被改變了,它能夠從服務器得到原始配置進行校訂。node
puppet與其餘手工操做工具備一個最大的區別就是 puppet的配置具備穩定性,所以你能夠屢次執行puppet, 一旦你更新了你的配置文件,puppet就會根據配置文件來更改你的機器配置,一般每30分鐘檢查一次. puppet會讓你的系統狀態同配置文件所要求的狀態保持一致. 好比你配置文件裏面要求ssh服務必須開啓. 假如不當心ssh服務被關閉了,那麼下一次執行puppet的時候,puppet會發現這個異常,而後會開啓 ssh 服務. 以使系統狀態和配置文件保持一致.puppet就象一個魔術師,會讓你的混亂的系統收斂到puppet配置文件所想要的狀態.linux
puppet工做流程:shell
一、客戶端經過facter收集客戶端信息併發送至服務端數據庫
二、鏈接服務端並請求catalog日誌json
三、請求節點(node)的信息vim
四、從服務器端接收節點(node)的實例ruby
五、編譯代碼(包括語法檢查等工做)bash
六、查詢是否有exported 虛擬資源.若有,則從數據庫接收虛擬資源服務器
七、接收完整的catalog日誌
八、存儲catalog日誌到數據庫
九、客戶端接收完整的catalog日誌
下面是puppet的一些簡單配置:(系統環境爲rhel6.5,iptables and selinux disable)
master端:172.25.254.1 server1.example.com
client端:172.25.254.2 server2.example.com
client端:172.25.254.3 server3.example.com
master端安裝:
yum install puppet-server-3.8.1-1.el6.noarch.rpm puppet-3.8.1-1.el6.noarch.rpm -y
所需的依賴性:
facter-2.4.4-1.el6.x86_64.rpm hiera-1.3.4-1.el6.noarch.rpm rubygem-json-1.5.5-3.el6.x86_64.rpm ruby-shadow-2.2.0-2.el6.x86_64.rpm ruby-augeas-0.4.1-3.el6.x86_64.rpm rubygems-1.3.7-5.el6.noarch.rpm -y
client端安裝:
yum install puppet-3.8.1-1.el6.noarch.r pm -y #所需的依賴性與master端同樣
在master端啓動master服務
/etc/init.d/puppetmaster start #在master端啓動puppet服務
用puppet客戶端鏈接puppet master:
puppet agent --server=server1.example.com --no-daemonize -vt #--server服務端主機 --no-daemonize再也不後臺運行 -v顯示詳細日誌,-t測試,
提示client向master端發出證書驗證請求,須要master端簽名並返回
在master端進行操做:
puppet cert list #顯示等待簽名的證書
手動簽名證書:
puppet cert sign server2.example.com
自動驗證簽名:
vim /etc/puppet/puppet.conf #puppet的主配置文件 autosign = true #容許全部客戶端的認證,要添加在main下面 vim /etc/puppet/autosign.conf #建立autosign.conf目錄用於添加白名單 *.example.com #容許全部example.com 域的主機 puppet cert list --all #顯示全部已經簽名的證書
此時在客戶端執行
puppet agent --server=server1.example.com --no-daemonize -vt
能夠看到以下輸出:
pupet的資源定義:
在master端:
cd /etc/puppet/manifests/ #文件存儲目錄(puppet 會先讀取該目錄的.PP 文件
) 1.建立文件:
vim site.pp #定義 puppet 相關的變量和默認配置,這個文件必須存在,puppet執行的第一個代碼就在這個文件中,並且其餘的代碼也要經過該文件調用 file { '/mnt/test': #要建立的文件 content => 'hello world' #文件內容 mode => 600, #文件權限 owner => puppet, #文件全部人 group => puppet #文件全部組 }
在客戶端
puppet agent --server=server1.example.com --no-daemonize -vt #由於加了-t參數因此puppet agent不會處於運行狀態,須要再次執行這個指令去同步master端的資源更改 [root@server2 ~]# cat /mnt/test hello world[root@server2 ~]# [root@server2 ~]# ll /mnt/test -rw------- 1 puppet puppet 11 Jul 4 09:51 /mnt/test
2.建立master端有的文件
mkdir /etc/puppet/files cp /etc/passwd /etc/puppet/files/ vim etc/puppet/fileserver.conf #文件服務器配置文件 [files] path /etc/puppet/files allow *.example.com /etc/init.d/puppetmaster reload vim /etc/puppet/manifests/site.pp file { '/mnt/passwd': source => 'puppet:///files/passwd' }
3.軟件包定義:
vim /etc/puppet/manifests/site.pp package { 'httpd': #軟件包稱 ensure => present }
4.服務定義:
service { 'httpd': ensure =>running, require => Package['httpd'] #設置啓動要求有,必需要有不然會出現先啓動服務後安裝軟件包的狀況,從而報錯。 }
5.添加用戶:
user { 'test': uid => 900, home =>'/home/test', shell =>'/bin/bash', provider =>useradd, managehome =>true, ensure =>present, } exec { 'echo westos | passwd --stdin test': #爲test用戶添加密碼 path => "/usr/bin:/bin", #所用腳本的路徑 onlyif => 'id test' #須要有test用戶 }
6.自動掛在文件系統並同步fstab文件:(這裏用的是nfs共享的文件)
package { 'httpd': ensure => present; 'nfs-utils': ensure => present } file { "/public": ensure =>directory } mount { "/public": device => "172.25.254.55:/mnt", fstype => "nfs", options => "defaults", ensure => mounted #如需卸載改成absent }
7.建立計劃任務
cron { echo: command => "/bin/echo `/bin/date` >> /tmp/echo", user => root, hour => ['2-4'], minute => '*/10' }# 任務會在 client 上/var/spool/cron 目錄中生成。
不一樣節點的定義
mkdir /etc/puppet/manifests/nodes
定義server2主機的資源
vim /etc/puppet/manifests/nodes/server2.example.com.pp node 'server2.example.com'{ package { 'httpd': ensure => present } service { 'httpd': ensure =>running, require => Package['httpd'] } }
定義server3主機的資源
vim /etc/puppet/manifests/nodes/server3.example.com.pp node 'server2.example.com'{ package { 'httpd': ensure => present } service { 'httpd': ensure =>stopped, require => Package['httpd'] } } vim /etc/puppet/manifests/site.pp import 'nodes/*.pp'
注意各節點的資源不要在site.pp中重複出現以避免發生衝突在client端出現以下錯誤:
編寫模塊:
cd /etc/puppet/modules/ #模塊目錄 mkdir httpd #httpd模塊 cd httpd mkdir files #用於放置httpd的配置文件 cp /etc/httpd/conf/httpd.conf files/ mkdir manifests #用於放置模塊的僞代碼 cd manifests vim install.pp class httpd::install { package{ 'httpd': ensure => present } } vim config.pp class httpd::config { file { '/etc/httpd/conf/httpd.conf': #客戶端httpd的配置文件存放處 source =>'puppet:///modules/httpd/httpd.conf' #puppet會自動到htppd類的files裏找配置文件。 require =>Class['httpd::install'], notify =>Class['httpd::service'] } } vim service.pp class httpd::service{ service{ 'httpd': ensure =>running require =>Class ['httpd::install','httpd::config'] } } vim init.pp class httpd { include httpd::install,httpd::config,httpd::service } /etc/puppetmaster reload
從新加載服務後就可使用這個模塊了
vim /etc/puppet/manifests/nodes/server2.example.com.pp node 'server2.example.com'{ include httpd }
給模塊添加模版應用
cd /etc/puppet/modules/httpd/ mkdir templates #用於存放模版應用 vim httpd_vhost.erb #添加模版,必須以*.erb結尾,這裏添加的是httpd的虛擬主機模版 <VirtualHost *:80> ServerName <%= domainname %> DocumentRoot /var/www/<%= domainname %> ErrorLog logs/<%= domainname %>_error.log CustomLog logs/<%= domainname %>_access.log common </VirtualHost> vim /etc/puppet/modules/httpd/files/httpd.conf #開啓httpd中的虛擬主機功能 NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /var/www/html ServerName server2.example.com </VirtualHost> vim /etc/puppet/modules/httpd/manifests/init.pp define httpd::vhost($domainname) { file { "/etc/httpd/conf.d/${domainname}_vhost.conf": content => template("httpd/httpd_vhost.erb"), require => Class["httpd::install"], notify => Class["httpd::service"] } file { "/var/www/$domainname": ensure => directory } file { "/var/www/$domainname/index.html": content => $domainname } }
在server2節點上應用這個模版
vim /etc/puppet/manifests/nodes/server2.example.com.pp node 'server2.example.com'{ include httpd httpd::vhost {'www.example.com': domainname => "www.example.com", } httpd::vhost {'www.linux.com': domainname => "www.linux.com", } }
在server2主機上同步後就可使用虛擬主機了