1.什麼是Puppet? html
puppet 是一個配置管理工具, 典型的, puppet 是一個 C/S 結構, 固然,這裏的 C 能夠有不少,因此,也能夠說是一個星型結構. 全部的 puppet 客戶端同一個服務器端的 puppet 通信. 每一個puppet 客戶端每半小時(能夠設置)鏈接一次服務器端, 下載最新的配置文件,而且嚴格按照配置文件來配置服務器. 配置完成之後,puppet 客戶端能夠反饋給服務器端一個消息. 若是出錯,也會給服務器端反饋一個消息 node
2.puppet 的細節和原理shell
puppet 的目的是讓你只集中於你要管理的目標,而忽略實現的細節,例如命令名,參數或者文件格式. puppet 把系統裏面的用戶,軟件包,服務看做是"資源", puppet 的做用就是管理這些資源以及資源之間的相互聯繫.Puppet 採用了很是簡單的 C/S 架構,全部數據的交互都經過 SSL 進行,以保證安全。它的工做流程如圖所示json
1. 客戶端 Puppetd 向 Master 發起認證請求,或使用帶簽名的證書。vim
2. Master 告訴 Client 你是合法的。3. 客戶端 Puppetd 調用 Facter,Facter 探測出主機的一些變量,例如主機名、內存大小、IP 地址等。Puppetd 將這些信息經過 SSL 鏈接發送到服務器端。安全
4. 服務器端的 Puppet Master 檢測客戶端的主機名,而後找到 manifest 對應的 node 配置,並對該部份內容進行解析。Facter 送過來的信息能夠做爲變量處 理,node 牽涉到的代碼才解析,其餘沒牽涉的代碼不解析。解析分爲幾個階段,首先是語法檢查,若是語法錯誤就報錯;若是語法沒錯,就繼續解析,解析的結 果生成一箇中間的「僞代碼」(catelog),而後把僞代碼發給客戶端。ruby
5. 客戶端接收到「僞代碼」,而且執行。bash
6. 客戶端在執行時判斷有沒有 File 文件,若是有,則向 fileserver 發起請求。服務器
7. 客戶端判斷有沒有配置 Report,若是已配置,則把執行結果發送給服務器。架構
8. 服務器端把客戶端的執行結果寫入日誌,併發送給報告系統。
http://puppet.wikidot.com 中文 wiki
實驗環境:
物理主機 redhat7.0 內核版本 3.10.0-123.el7.x86_64
虛擬機 redhat6.5 內核版本 2.6.32-431.el6.x86_64
master服務器 server1.example.com 172.25.254.1
Agent 客戶端 server2.example.com172.25.254.2
Agent 客戶端 server3.example.com172.25.254.3
Agent 客戶端 server4.example.com172.25.254.4
1.安裝puppet軟件包
1)在master服務器 server1上安裝puppet-server
# yum install -y puppet-server-3.8.1-1.el6.noarch.rpm puppet-3.8.1-1.el6.noarch.rpm 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
#/etc/init.d/puppetmaster start//啓動puppet-server
2)在Agent 客戶端 server2/server3/server4上安裝puppet:
#yum install -y puppet-3.8.1-1.el6.noarch.rpm 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
2.請求與認證(三種方式)
client 向 master 發出證書驗證請求,而後等待 master 簽名並返回證書。
2.1 客戶端(server2/server3)發送請求
#puppet agent --server 172.25.254.1 --no-daemonize -vt
//參數--server 指定了須要鏈接的 puppet master 的名字或是地址,默認鏈接名爲「puppet」的主機
如要修改默認鏈接主機能夠修改/etc/sysconfig/puppet 文件中的 PUPPET_SERVER=puppet 選項
參數--no-daemonize 是 puppet 客戶端運行在前臺
參數--verbose 使客戶端輸出詳細的日誌
2.2. master服務器 server2/server3 簽名認證
# cd /etc/puppet/manifests
puppet 的第一個執行的代碼是在/etc/puppet/manifest/site.pp,所以這個文件必須存在,並且其餘的代碼也要經過該文件來調用。
# touch site.pp#沒有此文件 puppet master 沒法啓動,配置後面再定義
#puppet cert list//有等待,顯示全部等待簽名的證書
#puppet cert sign server2.example.com//簽名
如要同時簽名全部證書,執行如下命令:
# puppet cert sign --all
#puppet cert list//就沒有等待了。
2.3 客戶端(server2/server3)再次發送請求
# puppet agent --server server1.example.com --no-daemonize -vt
Notice: Finished catalog run in 0.02 seconds//出現這條信息就行了
3.自動簽名
3.1 master服務器 server1 修改配置文件
# cd /etc/puppet/
# vim puppet.conf##添加
2 autosign = true
# vim autosign.conf
1 *.example.com
# /etc/init.d/puppetmaster reload
3.2 客戶端(server4)發送認證請求
[root@server4 update]# puppet agent --server server1.example.com --no-daemonize -vt
3.3 從新認證測試
當客戶端從新裝了系統以後或者在實際中有時會修改 client 端的主機名,這樣就須要從新生成證書:
3.3.1 master服務器 server1 先刪除以前認證的簽名
# puppet cert list --all
# puppet cert clean server2.example.com//要刪除的原 client 端主機名
3.3.2 客戶端(server2)上:
# cd /var/lib/puppet/ssl/
# rm -rf * # rpm -qf /var/lib/puppet/ssl,能夠看到ssl目錄是自動生成的,不依賴於任何軟件包
# puppet agent --server server1.example.com --no-daemonize -vt
###再次發送請求便可
4.puppet 資源定義
如下資源均定義在/etc/puppet/manifest/site.pp 文件中,在沒有指定節點的狀況下,對全部已經通過驗證的 client 都生效。
4.1 文件
4.1.1 master服務器 server1上:
[root@server1 manifests]# ls
site.pp
[root@server1 manifests]# vim site.pp
[root@server1 manifests]# cd /etc/puppet/
[root@server1 puppet]# mkdir files
[root@server1 puppet]# cd files
[root@server1 files]# cp /etc/passwd .
[root@server1 files]# vim /etc/puppet/fileserver.conf
[root@server1 files]# /etc/init.d/puppetmaster reload
4.1.2 在Agent 客戶端 server2和客戶端 server3上
# puppet agent --server server1.example.com --no-daemonize -vt
[root@server2 ~]# cat /tmp/testfile
willis.blog.51cto.com[root@server2 ~]#
[root@server2 ~]# cd /tmp/
//所建立的tmp/testfile默認設置爲md5sum加密,當手動改寫testfile中的內容後,它的md5會改變,當再次執行向puppt-server的請求後,md5又會再次恢復。
4.1.3 服務器server1上:
# vi /etc/puppet/manifests/site.pp
1 file {
2 "/tmp/testfile":
3 source => "puppet:///files/passwd"
4 }
可再次實驗認證。
server2上再次測試:
4.2軟件包定義
4.2.1 server2上安裝httpd服務與vsftpd服務
4.2.2 服務器端server1定義軟件包規則
軟件包定義方法:
1)package {
"vsftpd":
ensure => absent
}
2)package {
"vsftpd":
ensure => present;
"man":
ensure => present
}
3)package {
["vsftpd","man"]:
ensure => absent;
}
[root@server1 puppet]# vim manifests/site.pp
4.2.3 客戶端server2同步服務器端規則,檢查軟件包安裝狀況
[root@server2 tmp]# puppet agent --server server1.example.com --no-daemonize -vt
4.3. 服務定義
4.3.1 server2上啓動httpd服務與vsftpd服務
4.3.2 服務器端server1定義服務規則
[root@server1 puppet]# vim manifests/site.pp
4.3.3 客戶端server2同步服務器端規則,檢查服務啓動狀況
[root@server2 tmp]# puppet agent --server server1.example.com --no-daemonize -vt
4.3.4 對httpd服務進行全面定義
服務器端server1定義服務規則以下:
[root@server1 puppet]# vim manifests/site.pp
file {
"/var/www/html/index.html":
content => "willis.blog.51cto.com",
require => Package["httpd"]
}
file {
"/etc/httpd/conf/httpd.conf":
source =>"puppet:///files/httpd.conf",
require =>Package["httpd"],
notify =>Service["httpd"]
}
package {
"httpd":
ensure => present
}
service {
"httpd":
ensure => running,
require => File["/etc/httpd/conf/httpd.conf"]
}
4.3.5客戶端測試
首先卸載httpd服務,而後獲取
[root@server2 tmp]# puppet agent --server server1.example.com --no-daemonize -vt
4.4 組定義
group { "willis": gid => 600 }
4.5. 用戶定義
方法一:
user { "willis":
uid => 600,
gid => 600,
home => "/home/willis",
shell => "/bin/bash" ,
password => willis
}
file { "/home/willis":
owner => willis,
group => willis,
mode => 700,
ensure => directory
}
file { "/home/willis/.bash_logout":
source => "/etc/skel/.bash_logout",
owner => willis,group => willis
}
file { "/home/willis/.bash_profile":
source => "/etc/skel/.bash_profile",
owner => willis,
group => willis
}
file { "/home/willis/.bashrc":
source => "/etc/skel/.bashrc",
owner => willis,
group => willis
}
user { "test": uid => 900,
home => "/home/test",
shell => "/bin/bash",
provider => useradd,
managehome => true,
ensure => present
}
exec { "echo westos | passwd --stdin test":
path => "/usr/bin:/usr/sbin:/bin",
onlyif => "id test"
}
方法二:
user {
"test": uid => 900,
home => "/home/test",
shell => "/bin/bash",
provider => useradd,
managehome => true,
ensure => present
}
exec { "echo willis | passwd --stdin test":
path => "/usr/bin:/usr/sbin:/bin",
onlyif => "id test"
}
4.6文件系統掛載
4.6.1 服務端配置
[root@server1 puppet]# vim manifests/site.pp
file {
"/public":
ensure => directory
}
mount {
"/public":device => "172.25.254.1:/var",
fstype => "nfs",
options => "defaults",
ensure => mounted
}
自動掛載文件系統,並同步 fstab 文件,若是須要卸載,改成 absent
4.6.2 服務端nfs配置
[root@server1 puppet]# yum install nfs-utils -y
[root@server1 puppet]# /etc/init.d/nfs start
[root@server1 puppet]# vim /etc/exports
/var*(ro)
[root@server1 puppet]# exportfs -rv
exporting *:/var
4.7 crontab 任務
[root@server1 puppet]# vim manifests/site.pp
cron { echo:
command => "/bin/echo `/bin/date` >> /tmp/echo",
user => root,
hour => ['2-4'],
minute => '*/10'
}
# 任務會在 client 上/var/spool/cron 目錄中生成。