兩台機器 192.168.1.122 (伺服器) 192.168.1.124(用戶端)
兩台機器關閉selinux,清空iptebles規則,并儲存,設定hostname
122上HOSTNAME=web1.bbs.com vim /etc/sysconfig/network 定義hostname
124上HOSTNAMEweb2.bbs.com vim /etc/sysconfig/network 定義hostname
編輯hosts檔案 122和124全為
192.168.1.122 web1.bbs.com
192.168.1.124 web2.bbs.com
兩台機器安裝ntpdate,并建立自動同步時間的任務計劃
yum install -y ntp
cront -e 加入
*/10 * * * * ntpdate ntpdate time.nist.gov > /dev/null 2>& 1
伺服器端
安裝puppet源
rpm -ivh "http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm"
作用
ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Media.repo epel-testing.repo
CentOS-Debuginfo.repo CentOS-Vault.repo puppetlabs.repo
CentOS-fasttrack.repo epel.repo
安裝服務端程式
yum install -y puppet-server
啟動服務
service puppetmaster start
開機啟動
chkconfig puppetmaster on
用戶端
安裝puppet源
rpm -ivh "http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm"
安裝客戶程式
yum install -y puppet
修改配置檔案
vim /etc/puppet/puppet.conf 在最後添加
server = web1.bbs.com
runinterval = 10 主動更新,每隔30秒
service puppet start
chkconfig puppet on
配置認證
伺服器檢視用戶端證書清單
puppet cert list --all 如果簽發的認證,會本行最前面帶一個+
用戶端上生成ssl證書
puppet agent --test --server web1.bbs.com
伺服器端簽發指定用戶端證書
puppet cert --sign web2.bbs.com
伺服器端可以删除指定用戶端證書
puppet cert clean web2.bbs.com
删除所有證書
puppet cert clean --all
删除證書的時候有時候就不顯示用戶端l
删除下面的目錄 重新開機用戶端服務
rm -rf /var/lib/puppet/ssl/* 存放證書的目錄
/etc/init.d/puppet restart
[root@web1 ~]# puppet cert list --all
"web2.bbs.com" (SHA256) 87:EF:DA:AE:22:58:08:7C:8A:F0:71:AB:D2:AB:6D:33:AB:31:BF:21:6C:A0:A8:4F:F4:AB:52:47:0A:99:A4:86
[root@web1 ~]# puppet cert --sign web2.bbs.com
Notice: Signed certificate request for web2.bbs.com
Notice: Removing file Puppet::SSL::CertificateRequest web2.bbs.com at '/var/lib/puppet/ssl/ca/requests/web2.bbs.com.pem'
配置自動簽發證書
vim /etc/puppet/puppet.conf
main末尾
加上 # Where SSL certificates are kept.
# The default value is '$confdir/ssl'.
ssldir = $vardir/ssl
autosign = true 支援自動簽名
伺服器端删除用戶端證書 puppet cert clean web2.bbs.com
用戶端删除ssl相關檔案 rm -rf /var/lib/puppet/ssl*
伺服器建立自動簽發的配置檔案 vim /etc/puppet/autosign.conf 加入一下内容
*.bbs.com
伺服器重新開機puppetmasert服務 /etc/init.d/puppetmaster restart
用戶端重新開機puppet服務 /etc/init.d/puppet restart
服務端
puppet cert list --all 可以看到web2.bbs.com已經簽名
如果用戶端不重新開機puppet服務,也可以通過指令來自動簽發
測試證書
伺服器上編輯配置檔案
vim /etc/puppet/mainfests/site.pp 添加如下内容 主配置檔案
node default {
file {"/tmp/123.txt";
content => "test.test";
}}
說明:該配置檔案後面還會講到,如果不配置該檔案,則用戶端不會同步任何資料
用戶端上稍等一會 每隔10s會自動執行服務端上的任務
tcpdump -nn host 192.168.1.122 抓包
這樣在用戶端的/tmp/下會有個123.txt檔案,内容為test,test
這樣認證就成功了
清空掉 就不管用了
定義子產品管理
子產品是puppet的配置單元,子產品裡面會包含類和資源,同步檔案,遠端執行指令,cron等叫做資源,都是通過子產品來實作的,下面來寫一個子產品
伺服器端建立目錄 mkdir /etc/puppet/modules/testm 這個目錄名字也作為子產品名字,然後繼續建立子產品對應的子目錄mkdir /etc/puppet/modules/testm/{files,manifests,templates} file裡面存檔案,可以留白,mamifests裡面是配置檔案,templates裡面是子產品檔案可以為空
建立配置檔案 vim /etc/puppet/modules/testm/manifests/init.pp 初始入口的配置檔案很關鍵
class testm{
file {"tmp/2.txt":
owner => "root",
group => "root",
mode => 0400,
source => "puppet://$puppetserver/modules/testm/1.txt"
說明:類名字也叫作testm,類下面定義了一個資源file,檔案名字叫做/tmp/2.5s5,owner,group,mode定義檔案的屬主,屬組以及權限,source定義這個檔案從哪裡擷取,$puppetserver一會也要定義一下,這裡指的是puppetserver伺服器上/etc/puppet/modules/testm/files/1.txt
下面要繼續定義一個很關鍵的配置檔案
vim /etc/puppet/manifests/site.pp
$puppetserver='web1.bbs.com'
node 'web2.bbs.com'{
include testm
}
說明:$puppetserver定義服務端的主機名,node後面為用戶端的主機名,這裡面定義該用戶端要加載的子產品
配置完成後,在用戶端執行指令:
puppet agent --test --server=web1.bbs.com 如果用戶端上啟動了puppet服務,不用執行這指令,他也會自動同步的
檔案或目錄資源
上面的子產品其實隻是同步了一個檔案而已,那麼要怎麼同步一個目錄?可以通過實作同步一個目錄來做一個包釋出系統 比如在一台機器上便已安裝好了Apache,那麼就可以通過這樣的子產品把這個Apache目錄整個釋出到其他機器上
伺服器配置
子產品配置如下
cless apache{
file {"/usr/local/apache2":對方機器上的目錄
owner => "root",
group => "root",
source => "puppet://$puppetserver/modules/testm/apache2",從服務的目錄下載下傳
recurse => true
purge => true
其中recurse=>這個參數很關鍵,表示遞歸的意思,沒有這個不能同步目錄 purge參數可以保證當服務端删除某個檔案,用戶端可以跟着删除
遠端執行指令
exec {"123":
unless => "test -f /tmp/55.txt",
path => ["/bin", "/sbin", "/usr/bin", "/usr/sbin"],
command => "touch /tmp/55.txt
說明:123隻是作為該資源的一個名字,unless後面的指令作為條件,當條件成立時不會執行下面的指令,如果想要條件成立時,執行下面的指令,用onlyif,要注意的是,一定要給執行的這條指令加個條件,使用unless就可以,必須滿足這個條件才能執行指令,否則這個指令會一直執行,不太妥當
任務計劃
cron{"222":
command => "/sbin/ntpdate time.windows.com",
user => "root"
minute => "*/10",
minute => ”10-15“,
#ensure => "absent"