Puppet 的部署與應用,看這一篇就夠了
工作原理 Puppet的目的是讓管理員只集中於要管理的目標,而忽略實現的細節。Puppet既可以在單機上使用,也可以c/s使用,在大規模使用puppet的情況下,通常使用c/s結構,在這種結構中puppet客戶端只執行puppetclient,puppet伺服器只執行puppetmaster。 工作流程 1)客戶端puppet呼叫facter(facter是通過ssl加密收集及檢測分析客戶端配置資訊的一個工具),facter探測出主機的一些變數,如主機名,記憶體大小,ip地址等。Puppet把這些資訊通過ssl連線傳送到伺服器器端
2)伺服器端的puppetmaster通過facter工具分析檢測客戶端的主機名,然後找到專案主配置檔案mainfest裡面對應的node配置,並對該部分內容進行解析。Facter傳送過來的資訊可以作為變數處理,node牽扯到的程式碼才解析,其他沒牽涉的程式碼不解析,解析分為幾個階段,首先進行語法檢查,如果語法沒錯,就繼續解析,解析的結果生成一箇中間的“虛擬碼”,然後把虛擬碼傳送給客戶端。 3)客戶端接收到虛擬碼,並執行,客戶端把執行的結果傳送給伺服器。 4)伺服器把客戶端的執行結果寫入日誌。
Puppet工作過程有以下兩點值得注意: 1)為了保證安全,client和master之間是基於ssl和證書的,只有經master證書認證的client可以與master通訊。 2)Puppet會讓系統保持在人們所期望的某種狀態並一直維持下去,例如:檢測某個檔案並保證其一直存在,保證ssh服務始終開啟,如果檔案被刪除了或者ssh服務被關閉了,puppet下次執行時(預設30分鐘),會重新建立該檔案或者啟動ssh服務。
● 安裝puppet的實驗步驟 ● 搭建puppetmaster ● 搭建puppetclient ● 配置測試節點 ● 客戶端主動拉取 ● 伺服器推送 搭建 puppetmaster 規劃伺服器主機名(小規模可以修改/etc/hosts檔案,伺服器多的時候我們需要搭建dns伺服器來實現服務通過主機名進行通訊,這裡就以/etc/hosts檔案來實現) (puppetmaster)
[root@master /]# vim /etc/sysconfig/network HOSTNAME=master.itzhushou.cn . 192.168.1.10 master.itzhushou.cn [root@master /]# vim /etc/hosts 192.168.1.30 client2.itzhushou.cn 192.168.1.20 client1.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)
[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)
[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 /]# cd /media/ [root@master /]# mount /dev/cdrom /media/ [root@master /]# ls [root@master /]# cd /usr/facter-1.7.1/ [root@master /]# tar zxf facter-1.7.1.tar.gz -C /usr/ [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/modules [root@master /]# mkdir /etc/puppet/manifests
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 /]# hostname . [root@master /]# reboot
伺服器時間同步 [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 /]# tar zxf facter-1.7.1.tar.gz -C /usr/ [root@master /]# cd /media/ [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/
應用案例 1、配置一個測試節點 節點資訊:/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 /]# chown -R puppet /etc/puppet/modules/ [root@master /]# mkdir /etc/puppet/modules/ssh/files/ssh [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, //確定客戶端此檔案存在 group => "root", //檔案所屬組 owner => "root", //檔案所屬使用者 mode => "0600", //檔案許可權 source=> "puppet://$puppetserver/modules/ssh/ssh/sshd_config", //從伺服器同步檔案的路徑 require => Class["ssh::install"], //呼叫ssh::install確定 openssh已經安裝
這個檔案的內容主要是定義,釋出的配置檔案許可權以及呼叫ssh::install檢查client是否安裝了ssh服務,以及呼叫ssh::service重新啟動sshd服務。 notify => Class["ssh::service"], //如果config.pp發生變化通知service.pp } } 建立模組配置檔案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, //服務是否開機啟動
建立模組主配置檔案init.pp require=>Class["ssh::config"] //確認config.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
[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/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 在客戶端檢視埠是否改變 原文釋出時間為:2018-11-20 本文作者:李佳良 本文來自雲棲社群合作伙伴“高效運維 ”,瞭解相關資訊可以關注“高效運維”。