puppet簡明教程

puppet簡明教程
一、puppet工作流程介紹及安裝:
puppet是一款自動化的管理工具,有了他的存在我們可以省去繁雜的重複性的操作。只要定義好相應的規則策略,就能將服務器設置成爲我們希望的目標狀態。
1、puppet的工作模型。


首先定義資源的狀態,所謂的資源的狀態,就是我們希望客戶端的機器需要實現什麼樣的目標狀態(比如說安裝linux,安裝mysql等),之後在客戶端進行模擬部署,再到後面的強制執行,之後將執行的結果返回給master端可以利用第三方監控工具進行展示。
2、puppet的工作流程。


3、puppet的安裝
一般在生產環境中,puppet都是應用在M/S模型下,首先介紹master端的安裝
puppet的yum源地址yum.puppetlabs.com,在這個地址可以下載puppet以及puppet-server的rpm包,下載好了之後直接yum安裝就可以了。
需要注意的是puppet是需要ruby作爲支持的,首先需要保證我們的ruby是安裝的。比較穩定的版本是ruby 1.8.7。


二:puppet核心資源介紹
puppet核心的地方就是資源的應用,下面簡單的介紹下幾種資源的使用方法:
package:用於軟件包的安裝
service:控制服務的啓動情況
file:定義文件
exec:命令的執行
notify:消息通知
user:定義用戶
group:定義用戶組
cron:設置任務計劃
1、package
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
ensure =>present 代表的是需要安裝上nginx,absent表示卸載,latest表示安裝的需要是最新的。下面的yum表示我們安裝的方式是什麼。此處表示的是yum安裝。
2、service
service{'nginx':
        ensure  =>true,
        enable  =>true,
}
ensure表示安裝完之後啓動服務,enable表示nginx服務以後開機啓動(chkconfig nginx on),在定義資源的時候,一般會給資源一個名字,比如上面的package ‘nginx’,service ‘nginx’,並且同一種資源同一個名字只能出現一次。比如我們既然有了一個叫做nginx的package資源就不能再出現同一個的package也叫作nginx。另外兩個屬性之間利用逗號分開。屬性的值一般利用單引號或者是雙引號引起來。但是上面例子中的true爲關鍵字不需要引起來。
3、file
file{'nginx.web.conf':
        ensure  =>file,
        path    =>'/etc/nginx/conf.d/default.conf',
        source  =>'puppet:///modules/nginx/nginx.web.conf',
        mode    =>0644,
       }
path指定文件的路徑,source指定了在有模塊和類的情況下,我們需要從哪個文件獲取這個文件。mode爲文件的權限。
4、user,group
group {'username':
  ensure => present,
}
 user { 'username':
   ensure           => 'present',
   home             => '/home/username',
   managehome       => true,
   password          =>’***************’ 
   password_max_age => '99999',
   password_min_age => '0', 
   shell            => '/bin/bash',
 }
注意password是我們生成的密文的密碼openssl passwd -1 -salt '****',可以利用此命令生成,然後將密碼粘貼到此處。
4、exec
    exec { "tar -xf /Volumes/nfs02/important.tar":
          cwd     => "/var/tmp",
          creates => "/var/tmp/myfile",
          path    => ["/usr/bin", "/usr/sbin"]
        }




exec{'echo hello>>/home/xizhao/test.txt':
    path    =>'/usr/bin/:/bin:/sbin:/usr/sbin,
}
其中path位置說明下命令的爲止,一般title位置就寫好我們需要執行的命令,下面的無非就是,cwd說明的是命令運行的目錄,creates後面的value是後面需要創建的文件。
5、notify
notify {'hello world':
    message =>'hello world',
}
message後面直接接上的是要提示的內容。
6、cron
 cron { logrotate:
      command => "/usr/sbin/logrotate",
      user    => root,
      hour    => ['2-4'],
      minute  => '*/10'
}
command定義執行的命令,user定義用戶,hour設置時間,此處代表的是2點到4點每10分鐘執行一次這個命令。
經常使用的大概就是這幾種資源。但是在資源的使用過程中,會有資源之間的相互依賴關係。比如在使用package安裝nginx服務,並且在使用service啓動nginx的過程中,首先我們需要保證的是nginx先安裝,在啓動。由此我們需要定義相關的依賴關係
下面通過一個例子加以說明:
  file{'nginx.web.conf':
        ensure  =>file,
        path    =>'/etc/nginx/conf.d/default.conf',
        source  =>'puppet:///modules/nginx/nginx.web.conf',
        mode    =>0644,
        require =>Package['nginx'],
}
    service{'nginx':
        ensure  =>true,
        enable  =>true,
        restart => '/etc/init.d/nginx reload',
        subscribe   =>File['nginx.conf','nginx.web.conf'],
}
require:我們需要引用的資源,引用的時候用法資源類型首字母大寫,然後將資源的名稱括起來,。require代表的是當前資源執行時,需要某個資源已經執行好。
before:當前資源的執行需要在某個資源的前面執行,和require是相對的。
subscribe:如果我們訂閱的資源發生改變的時候,就執行當前資源。
notify:當前資源執行的時候,通知某個資源需要執行,和subscribe相對。
另外在資源的執行過程中我們同樣可以使用->  ~>代表的是資源之前的依賴關係,->代表的是先執行符號前面的資源然後執行符號後面的資源,~>代表的訂閱關係,前面的資源執行,通知後面的資源執行。


三、selector和case,if的差在哪裏:
在使用puppet的過程中,經常會使用到變量,例如在安裝web的過程中,我們根據操作系統的不同安裝的webserver也是會有明顯的差異的。比如說在centos或者是redhat上面我們安裝的名字叫做httpd但是在Ubuntu或者是debian上面名字叫做apache2。
1、利用selector
$package = $operatingsystem ?{
/(?i-mx:redhat|centos|fedora)/   =>'httpd',
/(?i-mx:ubuntu|debian)/         =>'apache2',
}


package{"$package":
        ensure  =>present,
}
首先判斷操作系統的版本類型並將操作系統的版本保存到package變量中去,然後利用變量進行軟件包的安裝。


2、利用case
3、
case $operatingsystem {
'CentOS','redhat':   {package{'httpd': ensure =>present}}
/^(Debian|Ubuntu)$/:   {package{'apache2':ensure =>present}}
default:    {notice("Unknown system")}
}
通過上面我們可以發現,利用selector的話我們可以直接將得到的結果賦值給一個變量,並且selector後面跟的也同樣是一個變量。但是case後面跟的是一個程序塊。如上面的例子中case後面接的package資源塊。
3、if
if $operatingsystem == 'CentOS' {
        notify{'centos': message =>'hello centos'}
}elsif $operatingsystem == 'Redhat'{
        notify{'redhat': message =>'hello redhat'}
}elsif $operatingsystem == 'Debian' {
        notify{'Debian': message =>'hello debian'}
}else {notify {'other os': message =>'other os'}}
if和case的情況相同後面同樣是一個代碼塊。


四:puppet模塊的使用
在puppet中,有模塊的概念,模塊在本質上是一類資源的集合,並且模塊中的資源可以實現類的相互繼承,並且可以利用模板生成相關的文件。
1、
modules/
└── nginx
    ├── files
    ├── lib
    ├── manifests
└── templates
files:目錄用於存儲文件
lib:ruby插件存儲目錄
manifests:清單文件存儲目錄
templates:模板文件存儲目錄
note:在編寫清單文件的時候,清單文件中必須包含的是一個叫做init.pp的文件,並且這個文件中必須包含一個和模塊名字相同的類。
class nginx {
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
    service {'nginx':
        ensure  =>true,
        enable  =>true,
        subscribe =>File['nginx.conf'],
}
    file {'nginx.conf':
        ensure  =>file,
        path    =>'/etc/nginx/nginx.conf',
        mode    =>0644,
        require =>Package['nginx']
 }


}
include nginx
在上面的例子中,定義了三個資源並且定義了三個資源的依賴關係,最後的include nginx是對nginx資源的引用。如果我們在單擊的模型中,想驗證清單文件是不是能夠正常使用,我們可以puppet apply -d -v -e’include nginx(class-name)’可以顯示類應用的詳細的信息。
2、另外在引用類的過程中,可以使用變量
$webserver = $operatingsystem ? {
    /^(?i-mx:redhat|centos|fedora)/  =>'httpd',
    /^(?i-mx:ubuntu|debian)/         =>'apache2',


}
class httpd($pkgname = 'apache2') {
    package  {"$pkgname":
        ensure      =>present,
        provider    =>yum,
}
    service {"$pkgname":
        ensure  =>true,
        enable  =>true,
        require =>Package["$pkgname"],
}


}
class {'httpd':
    pkgname    =>$webserver,


注意此時如果我們在本機測試的話,直接puppet apply  httpd.pp(name)就可以了,不要使用puppet apply -v -d -e’include http’如果這樣的話前面的判斷賦值工作就不會做,那麼會按照apache2進行安裝。


五、類的繼承
1、在使用模塊的過程中,一個模塊的manifests可以定義多個清單文件,並且多個清單文件直接可以實現繼承。
在/etc/puppet/modules/nginx/manifests中定義init.pp文件。其中這個文件只是定義package的安裝。
class nginx {
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
}
定義子清單
class nginx::web inherits nginx {
    file {'web.nginx.conf':
        ensure  =>file,
        mode    =>0644,
        path    =>'/etc/nginx/nginx.conf',
        source  =>'puppet:///modules/nginx/web.nginx.conf',
        require =>Package['nginx'],
        notify  =>Service['nginx'],
}


    service {'nginx':
        ensure  =>true,
        enable  =>true,
}
}
source:引用的是files目錄下的文件,格式爲puppet:///modules/modules_name/file_name


2、利用模板生成配置文件
模板文件存放的位置是模塊目錄下的templates目錄下,其中模板的名字以erb結尾,並且在模板中可以使用facts變量。
例如,生成nginx配置文件的時候,其中的開起的進程數量是需要和服務器的物理核心數量是掛鉤的,所以在設置的時候可以
user nginx;
worker_processes <% processorcount %>;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
另外在使用模板生成配置文件是需要注意下
class nginx {
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
    file {'nginx.conf':
        path    =>'/etc/nginx/nginx.conf',
        ensure  =>file,
        content =>template('nginx/nginx.conf.erb'),
        mode    =>0644,
        require =>Package['nginx'],
}


}
模板的使用情況爲content =>template(‘module_name/template_file_name’)前面的屬性是content,此處需要注意。






五、puppet M/S架構
puppet是工作在M/S架構上面的,就是在master端定義好相關的清單文件,然後agent端會在規定的一個時間內去讀取清單文件,然後檢查自己的狀態是不是和清單文件中定義的一樣,如果不一樣則進行目標狀態的同步。
1、證書的簽訂
在master端安裝好puppet和puppet-server,agent端安裝好puppet客戶端即可。
證書的簽訂是依賴主機名的,所以首先需要在/etc/hosts設置好主機名的解析。在puppet的客戶端配置文件設置好server的主機名稱。puppet客戶端默認的是1800秒向server端同步一次。
證書的簽訂:
puppet提供了puppet cert 命令來專門的對證書進行操作。較爲常用的有
puppet cert list :查看等待服務器端簽訂的證書
puppet cert list --all:列出已經簽訂的所有的服務器證書
puppet cert sign hostname(--all):sign後面加上某個單獨的主機名的話是對某一個主機進行證書的認證,--all則是對所有請求的證書進行認證。
認證好的證書文件存放的位置是/var/lib/puppet/ssl
2、在使用某個資源的時候,可以利用puppet 進行查看
puppet help:查看puppet支持的命令
puppet describe --list:查看puppet支持的資源有哪些
puppet describe resource_name:查看某個資源的使用方法。
3、M/S實例:
server提供nginx的兩種配置,其中一種是nginx作爲普通的web服務器,另外一種是nginx作爲反向代理服務器。
建立nginx模塊
mkdir -pv /etc/puppet/modules/nginx/{templates,files,lib,manifests}
創建清單文件
cd /etc/puppet/modules/nginx/manifests
cat init.pp


class nginx {
    package {'nginx':
        ensure      =>present,
        provider    =>yum,
}
    file {'nginx.conf':
        path    =>'/etc/nginx/nginx.conf',
        ensure  =>file,
        content =>template('nginx/nginx.conf.erb'),
        mode    =>0644,
        require =>Package['nginx'],       
}




}
cat web.pp
class nginx::web inherits nginx{
    file{'nginx.web.conf':
        ensure  =>file,
        path    =>'/etc/nginx/conf.d/default.conf',
        source  =>'puppet:///modules/nginx/nginx.web.conf',
        mode    =>0644,
        require =>Package['nginx'],
}
    service{'nginx':
        ensure  =>true,
        enable  =>true,
        restart => '/etc/init.d/nginx reload',
        subscribe   =>File['nginx.conf','nginx.web.conf'],
}
}
cat rproxy.pp
class nginx::rproxy inherits nginx{
    file{'nginx.rproxy.conf':
        ensure  =>file,
        path    =>'/etc/nginx/conf.d/default.conf',
        source  =>'puppet:///modules/nginx/nginx.rproxy.conf',
        mode    =>0644,
        require =>Package['nginx'],
}
    service{'nginx':
        enable  =>true,
        ensure  =>true,
        subscribe   =>File['nginx.conf','nginx.rproxy.conf'],
}
}
note:nginx::web和nginx::rproxy都繼承了nginx類,所以子類中就有了兩個file的配置文件,需要注意的是,在同一個類中,同一個資源可以有兩個,但是這兩個的名字不能相同。此處的兩個配置文件一個是/etc/nginx/nginx.conf,而另外的一個則是/etc/nginx/conf.d/default.conf,另外需要注意的是service資源會訂閱兩個file資源,無論是主清單文件的file資源發生變化還是子清單的file資源發生變化都需要進行service資源的出發操作。
編輯主manifests,對模塊和清單進行調用
cd /etc/puppet/manifests
需要加載才能使用
cat node3.pp
node 'node3.com' {
    include nginx::web
}
cat nod4.com.pp
node 'node4.com' {
    include nginx::web
}
最後在site.pp中進行倒入
cat site.pp
import "node3.com.pp"
import "node4.com.pp"
同樣可以使用通配符  import “*.com.pp”
這樣定義好資源之後重新載入下服務,然後agent端會自動應用資源。
如果我們的資源中沒有模塊。那麼我們可以將資源直接定義在/etc/puppet/manifests/site.pp中。
4、在puppet安裝的過程中,如果不同的服務器的需求不一樣,我們可以使用節點的繼承來解決這個問題
例如:
DBserver:ntp,mysql,zabbix_agent
webserver:ntp,nginx,zabbix_agent
兩類節點都有需要安裝的同樣的部分,但是又都有自己單獨的需要安裝的軟件包。
node ‘base’ {
include ntp
include zabbix_agent
}
node ‘webserver.com’ inherits base {
include nginx
}
這樣就可以實現根據不同的需求來定義資源的引用。
5、多個主機需要用相同的資源
例如我們的webserver有多臺,都需要用同一個資源。我們可以使用node節點的正則表達式來實現
node /^node[1234]\.com$/ {
include nginx
}
六:puppet模塊管理
https://forge.puppet.com/
puppet module 
install
list
uninstall
upgrade
search
可以進行模塊的安裝,列出,卸載,升級等
七:puppet強制執行,在puppet2.7之後取消了puppet kick的主動推送
puppet kick -p 10 –host 客戶端    puppetrun -p 10 –host 客戶端 
好了,puppet的基礎就暫時這些,有了新的內容之後在更新。
發佈了166 篇原創文章 · 獲贊 16 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章