工做原理
Puppet的目的是讓管理員只集中於要管理的目標,而忽略實現的細節。Puppet既能夠在單機上使用,也能夠c/s使用,在大規模使用puppet的狀況下,一般使用c/s結構,在這種結構中puppet客戶端只運行puppetclient,puppet服務器只運行puppetmaster。
.
.php工做流程
1)客戶端puppet調用facter(facter是經過ssl加密收集及檢測分析客戶端配置信息的一個工具),facter探測出主機的一些變量,如主機名,內存大小,ip地址等。Puppet把這些信息經過ssl鏈接發送到服務器器端
2)服務器端的puppetmaster經過facter工具分析檢測客戶端的主機名,而後找到項目主配置文件mainfest裏面對應的node配置,並對該部份內容進行解析。Facter發送過來的信息能夠做爲變量處理,node牽扯到的代碼才解析,其餘沒牽涉的代碼不解析,解析分爲幾個階段,首先進行語法檢查,若是語法沒錯,就繼續解析,解析的結果生成一箇中間的「僞代碼」,而後把僞代碼發送給客戶端。
3)客戶端接收到僞代碼,並執行,客戶端把執行的結果發送給服務器。
4)服務器把客戶端的執行結果寫入日誌。
.
.nodePuppet工做過程有如下兩點值得注意:
1)爲了保證安全,client和master之間是基於ssl和證書的,只有經master證書認證的client能夠與master通訊。
2)Puppet會讓系統保持在人們所指望的某種狀態並一直維持下去,例如:檢測某個文件並保證其一直存在,保證ssh服務始終開啓,若是文件被刪除了或者ssh服務被關閉了,puppet下次執行時(默認30分鐘),會從新建立該文件或者啓動ssh服務。linux
.
.vim
安裝puppet的實驗步驟
搭建puppetmaster
搭建puppetclient
配置測試節點
客戶端主動拉取
服務器推送
.安全
.
搭建puppetmaster
規劃服務器主機名(小規模能夠修改/etc/hosts文件,服務器多的時候咱們須要搭建dns服務器來實現服務經過主機名進行通訊,這裏就以/etc/hosts文件來實現)
.
(puppetmaster)
.ruby
[root@master /]# vim /etc/sysconfig/network HOSTNAME=master.itzhushou.cn . [root@master /]# vim /etc/hosts 192.168.1.10 master.itzhushou.cn 192.168.1.20 client1.itzhushou.cn 192.168.1.30 client2.itzhushou.cn
.服務器
重啓生效 [root@master /]# reboot
.
(NTP)運維
[root@master /]# rpm -q ntp [root@master /]# vim /etc/ntp.conf (添加如下兩行) server 127.127.1.0 fudge 127.127.1.0 stratum 8 . 啓動ntp服務並開啓iptables例外 [root@master /]# service ntpd start [root@master /]# chkconfig ntpd on [root@master /]# iptables -I INPUT -p udp --dport 123 -j ACCEPT [root@master /]# service iptables save .
(puppetmaster)
.ssh
[root@master /]# hostname . 在puppetmaster上面配置時間同步,做爲ntp的客戶端 [root@master /]# ntpdate 192.168.1.40 [root@master /]# mount /dev/cdrom /media/ [root@master /]# cd /media/ [root@master /]# ls
.
安裝ruby(puppet就是基於ruby語言開發的,因此須要安裝ruby)tcp
[root@master /]# yum -y install compat-readline5 [root@master /]# yum -y install ruby
.
安裝完成以後檢查版本
[root@master /]# ruby -v [root@master /]#useradd -s /sbin/nologin puppet [root@master /]# cd /
.
安裝facter(經過facter工具分析檢測客戶端傳來的信息)
[root@master /]# umount /dev/cdrom /media/ [root@master /]# umount /dev/cdrom [root@master /]# mount /dev/cdrom /media/ [root@master /]# cd /media/ [root@master /]# ls [root@master /]# tar zxf facter-1.7.1.tar.gz -C /usr/ [root@master /]# cd /usr/facter-1.7.1/ [root@master /]# ruby install.rb
.
安裝puppet
編譯安裝:
[root@master /]# cd /media/ [root@master /]# tar zxf puppet-2.7.21.tar.gz -C /usr/ [root@master /]# cd /usr/puppet-2.7.21/ [root@master /]# ruby install.rb
.
複製配置文件
[root@master /]# cp conf/redhat/fileserver.conf /etc/puppet/ [root@master /]# cp conf/redhat/puppet.conf /etc/puppet/ [root@master /]# cp conf/redhat/server.init /etc/init.d/puppetmaster
.
修改文件屬性並建立puppet主目錄:
[root@master /]# chmod +x /etc/init.d/puppetmaster [root@master /]# mkdir /etc/puppet/manifets [root@master /]# mkdir /etc/puppet/manifests [root@master /]# mkdir /etc/puppet/modules
.
puppet服務證書請求與簽名
關閉防火牆(也可開例外)
Service iptables stop [root@master /]# service iptables stop
.
在[main]標題下添加一行:配置服務器模塊路徑
[root@master /]# vim /etc/puppet/puppet.conf modulepath = /etc/puppet/modules:/usr/share/puppet/modules
.
啓動puppet主程序
[root@master /]# service puppetmaster start [root@master /]# netstat -anpt | grep ruby
.
配置防火牆
[root@master /]# iptables -I INPUT -p tcp --dport 8140 -j ACCEPT [root@master /]# service iptables save
.
.
(puppetclient1)
.
搭建puppetclient
規劃服務器主機名
[root@master /]# vim /etc/sysconfig/network HOSTNAME=client1.itzhushou.cn
.
[root@master /]# vim /etc/hosts 192.168.1.10 master.itzhushou.cn 192.168.1.20 client1.itzhushou.cn 192.168.1.30 client2.itzhushou.cn . [root@master /]# reboot [root@master /]# hostname
.
服務器時間同步 [root@master /]# ntpdate 192.168.1.40
.
安裝ruby
[root@master /]# mount /dev/cdrom /media/ [root@master /]# yum -y install compact-readline5 reby 或者rpm -ivh compact-readline5......
.
安裝facter
[root@master /]# cd / [root@master /]# umount /dev/cdrom /media/ [root@master /]# mount /dev/cdrom /media [root@master /]# cd /media/ [root@master /]# tar zxf facter-1.7.1.tar.gz -C /usr/ [root@master /]# cd /usr/facter-1.7.1/ [root@master /]# ruby install.rb
.
安裝puppet
[root@master /]# cd /media/ [root@master /]# tar zxf puppet-2.7.21.tar.gz -C /usr/ [root@master /]# cd /usr/puppet-2.7.21/ [root@master /]# ruby install.rb
.
複製文件並設置執行權限
[root@master /]# cp conf/redhat/puppet.conf /etc/puppet/ [root@master /]# cp conf/redhat/client.init /etc/init.d/puppetclient [root@master /]# chmod +x /etc/init.d/puppetclient [root@master /]# service iptables stop
.
puppet服務證書請求籤名
[root@master /]# vim /etc/puppet/puppet.conf server = /master.itzhushou.cn
.
注意:puppetclient2的配置過程與puppetclient1相似,主機名改成client2.itzhushou.cn便可,其餘都同樣。
.
註冊服務器
分別在puppetclient1和puppetclient2上進行註冊,執行的命令同樣 [root@master /]# puppet agent --server=master.itzhushou.cn --no-daemonize --verbose
上面會一直等待,能夠按ctrl+c結束,可是服務器上已經有申請信息了
.
.
(puppetmaster)
.
能夠執行puppet cert --list 查看申請註冊客戶端
將未註冊的客戶端進行註冊Puppet cert sign --all
[root@master /]# puppet cert --list [root@master /]# puppet cert sign --all
.
能夠經過目錄去查看已經註冊的客戶端(看到下面的信息說明註冊成功了)
[root@master /]# ll /var/lib/puppet/ssl/ca/signed/
.
.
.
應用案例
一、配置一個測試節點
節點信息:/etc/puppet/manifests/nodes
模塊信息: /etc/pupppet/modules實驗目標:爲了保護linux的ssh端×××破,批量修改客戶端的sshd端口,將22號端口改成9922,並實現重啓sshd服務的工做。
想完成以上幾點,須要明確幾點:
①需肯定openssh軟件包安裝
②需肯定存在ssh的配置文件
③肯定sshd的服務是系統服務
建立ssh模塊,模塊的目錄爲ssh,模塊下有三個文件分別是:manifests、templates、files。
manifest裏面必須包含一個init.pp文件,這是該模塊的的初始(入口)文件,導入一個模塊的時候須要從init.pp開始執行,能夠把全部的代碼都寫入到這個文件中,也能夠分紅多個.pp文件,init在去包含其餘文件,定義class類名時必須是ssh,這樣才能實現調動
files目錄是該模塊的發佈目錄,puppet提供了一個文件分割機制,相似rsync的模塊。
templates目錄包含erb模塊文件、這個和file資源的templates屬性有關(不多使用)
master端
.
[root@master /]# rpm -q openssh
.
建立必要的目錄
[root@master /]# mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files} [root@master /]# mkdir /etc/puppet/manifests/nodes [root@master /]# mkdir /etc/puppet/modules/ssh/files/ssh [root@master /]# chown -R puppet /etc/puppet/modules/ [root@master /]# ll /etc/puppet/modules/ssh/
.
建立模塊配置文件install.pp
Vi /etc/puppet/modules/ssh/manifests/install.pp
輸入如下信息(首先肯定客戶端安裝了ssh服務)
.
[root@master /]# vim /etc/puppet/modules/ssh/manifests/install.pp class ssh::install{ package{ "openssh": ensure => present, } }
.
注意:present是以,結尾,因爲配置的是ssh服務,因此模塊名爲ssh,若是配置http,則模塊名爲http。
.
建立模塊配置文件config.php
[root@master /]# vim /etc/puppet/modules/ssh/manifests/config.pp``` class ssh::config{ file { "/etc/ssh/sshd_config": ensure =>present, owner =>"root", group =>"root", mode =>"0600", source =>"puppet://$puppetserver/modules/ssh/ssh/sshd_config", require => Class["ssh::install"], notify => Class["ssh::service"], } }
.
。
命令解釋
class ssh::config{
file{ "/etc/ssh/sshd_config": //配置客戶端須要同步的文件
ensure => present, //肯定客戶端此文件存在
owner => "root", //文件所屬用戶
group => "root", //文件所屬組
mode => "0600", //文件權限
source=> "puppet://$puppetserver/modules/ssh/ssh/sshd_config", //從服務器同步文件的路徑
require => Class["ssh::install"], //調用ssh::install肯定
openssh已經安裝
notify => Class["ssh::service"], //若是config.pp發生變化通知service.pp
}
}
這個文件的內容主要是定義,發佈的配置文件權限以及調用ssh::install檢查client是否安裝了ssh服務,以及調用ssh::service從新啓動sshd服務。
.
建立模塊配置文件service.pp
[root@master /]# vim /etc/puppet/modules/ssh/manifests/service.pp class ssh::service { service {"sshd": ensure=>running, hasstatus=>true, hasrestart=>true, enable=>true, require=>Class["ssh::config"] } }
.
命令解釋
class ssh::service{
service{ "sshd":
ensure =>running, //肯定sshd運行
hasstatus=>true, //puppet該服務支持status命令,即相似service
sshd status命令
hasrestart=>true, //puppet該服務支持status命令,即相似service
sshd status命令
enable=>true, //服務是否開機啓動
require=>Class["ssh::config"] //確認config.pp調用
}
}
.
建立模塊主配置文件init.pp
[root@master /]# vim /etc/puppet/modules/ssh/manifests/init.pp class ssh{ include ssh::install,ssh::config,ssh::service }
.
上面一共創建了4個文件,確保創建好
[root@master /]# ll /etc/puppet/modules/ssh/manifests/
.
創建服務器端ssh統一維護文件
因爲服務器端和客戶端的sshd_config文件默認同樣,此時將服務器端/etc/ssh/sshd_config複製到模塊默認路徑。
[root@master /]# cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/
[root@master /]# chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config
.
建立測試節點配置文件,並將ssh加載進去
Vi /etc/puppet/manifests/nodes/ssh.pp,輸入如下信息
[root@master /]# vim /etc/puppet/manifests/nodes/ssh.pp node 'client1.itzhushou.cn' { include ssh } node 'client2.itzhushou.cn' { include ssh }
.
將測試節點載入puppet,即修改site.pp
Vi /etc/puppet/manifests/site.pp,輸入如下信息:
[root@master /]# vim /etc/puppet/manifests/site.pp import "nodes/ssh.pp"
.
修改服務器端維護的sshd_config配置文件
[root@master /]# vim /etc/puppet/modules/ssh/files/ssh/sshd_config Port 9922
.
從新啓動puppet [root@master /]# /etc/init.d/puppetmaster restart
(puppetclient1)
配置客戶端主動拉取
通常在小規模自動化羣集中,如代碼上線須要從新啓動服務時,爲了防止網站暫時性沒法訪問的問題,每臺客戶端須要運行一次puppet agent -t命令,因此選擇模式時須要根據規模的大小來決定,通常運維工程師puppet服務器到各客戶端創建ssh信任,而後自定義腳本,ssh讓客戶端批量執行puppet命令同步。
在客戶端puppetclient1上執行命令:
[root@master /]# puppet agent -t
.
而後在客戶端上查看ssh配置文件的端口是否改變,並查看端口運行狀態:
[root@master /]# vim /et/ssh/sshd_config [root@master /]# netstat -anpt | grep ssh
.
.
服務器推送同步
1修改puppet主配置文件
在客戶端上執行下面命令:
Vi /etc/puppet/puppet.conf,在最後添加一行,使puppet監聽8139端口
[root@master /]# vim /etc/puppet/puppet.conf listen= true
.
修改puppet驗證配置文件,定義權限
在客戶端上執行:vim /etc/puppet/auth.conf
在最後一行添加下面的內容
[root@master /]# vim /etc/puppet/auth.conf allow * . 啓動puppet客戶端 [root@master /]# /etc/init.d/puppetclient start
.
.
(puppetmaster)
.
再次把服務器的ssh配置文件端口改成9933(換一個試試)
.
服務器推送給客戶端
[root@master /]# puppet kick client1.itzhushou.cn
.
在客戶端查看端口是否改變
(puppetclient1)