puppet簡介、安裝配置、語法、命令與例項
簡介
puppet主要使用於自動化運維方面,對於擁有眾多伺服器需要管理的管理員來說,puppet是個不錯的選擇,使其管理更加輕鬆,容易。其設計的是c/s建構,可以一個master和多個client。通過master可管理配置客戶端的檔案、使用者、cron任務、軟體包、系統服務等。客戶端預設半小時向master請求一次以使其與master配置同步,從而使管理員在master上設定配置就可以實現對於眾多客戶端機器的管理。
puppet是一種Linux、Unix、windows平臺的集中配置管理系統,使用自有的puppet描述語言,可管理配置檔案、使用者、cron任務、軟體包、系統服務等。puppet把這些系統實體稱之為資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。
puppet採用C/S星狀的結構,所有的客戶端和一個或幾個伺服器互動。每個客戶端週期的(預設半個小時)向伺服器傳送請求,獲得其最新的配置資訊,保證和該配置資訊同步。每個puppet客戶端每半小時(可以設定)連線一次伺服器端, 下載最新的配置檔案,並且嚴格按照配置檔案來配置伺服器,配置完成以後,puppet客戶端可以反饋給伺服器端一個訊息. 如果出錯,也會給伺服器端反饋一個訊息。
安裝與配置
作業系統centos7.3
1、安裝前準備
a.關閉selinux
sed -i '/s/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
b. 防火牆
systemctl stop firewalld && systemctl disable firewalld
c. 時間同步
ntpdatetime.nist.gov;echo '*/10 * * * * ntpdate time.nist.gov' >>/var/spool/cron/root
d. 配置域名解析,或直接在hosts裡配置主機名
e.設定ssh-key互相通訊
ssh-keygen
ssh-copy-id [email protected]
2、master安裝
安裝官方倉庫 rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm 安裝puppet yum -y install puppet puppet-server facter 檢視配置檔案 cp /etc/puppet/puppet.conf{,.bak} #備份配置檔案 vim /etc/puppet/puppet.conf [main] logdir = /var/log/puppet #預設日誌存放路徑 rundir = /var/run/puppet #pid存放路徑 ssldir = $vardir/ssl #證書存放目錄,預設$vardir為/var/lib/puppet [master] certname = puppetmaster.kisspuppet.com puppetmaster.kisspuppet.com #設定puppetmaster認證伺服器名 啟動puppet systemctl start puppetmaster
3、minion安裝
安裝官方倉庫
rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm
yum -y install puppet facter
檢視配置檔案
cp /etc/puppet/puppet.conf{,.bak}
vim /etc/puppet/puppet.conf
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
ssldir = $vardir/ssl
[agent]
classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
server = puppetmaster.kisspuppet.com #指向puppetmaster端
certname = agent1_cert.kisspuppet.com #設定自己的certname名
啟動puppet
systemctl start puppet
4、互相認證
[[email protected] ~]# puppet agent --test #向master斷髮起認證
[[email protected] ~]# puppet cert --list --all #檢視認證情況
[[email protected] ~]# puppet cert --sign agent1_cert.kisspuppet.com #註冊agent1
[[email protected] ~]# puppet cert --list --all #再次檢視認證情況
[[email protected] ~]# puppet agent --test #master自己申請agent認證
[[email protected] ~]# puppet cert --sign --all #註冊所有請求的節點
[[email protected] ~]# puppet cert --list --all #檢視所有節點認證
puppet語法
1、資源
常用的資源主要有以下幾個:
file:檔案管理 更詳細資料
package:軟體包管理 更詳細資料
service:系統服務管理 更詳細資料
cron:配置定期任務 更詳細資料
exec:執行shell命令 更詳細資料
a、資源公共屬性
before 用於控制不同物件(資源)的執行順序關係,表示某個物件(資源)在另一個物件之後發生(require與之相反,它表示之前發生)。
subscribe 檢測某個資源,當它發生變化時,該資源會重新載入。
b、file資源
owner 設定檔案的屬主
group 指定那個該檔案的使用者組,值可以是gid或者組名
mode mode用於設定檔案的許可權
content 一個檔案的內容可以由content屬性來包含固定的內容,
source 可以用source命令來從其他url複製檔案內容。
template 利用template,可以通過erb模板生成檔案內容,erb模板可以使用變數。而且還可以對變數進行計算和操作。
c、package資源
ensure 設定該軟體包應該在什麼狀態.
installed 表示要安裝該軟體,也可以寫成present;
absent 表示反安裝該軟體;
pureged 表示乾淨的移除該軟體;
latest 表示安裝軟體包的最新版本.
d、service資源
enable 服務在開機的時候是否啟動,可以設定的值是true和false,需要provider支援enableable
ensure 是否執行服務, running表示執行服務,stopped 表示停止服務
restart 指定重啟指令碼,否則就先停止該服務再啟動該服務
start 指定啟動服務的命令,通常init模式的管理指令碼都支援,不需要手工指定
status 指定status命令,如果不指定,就從程序列表查詢該服務
stop 指定停止服務的指令碼.
2、類和函式
a、類
類可以把多個相關的資源定義在一起,組成一個類,類可以繼承。
|
b、函式
函式(在puppet中稱為“defination”)可以把多個資源包裝成一個資源,或者把一個資源包裝成一個模型,便於使用。
|
3、節點
puppet如何區分不同的客戶端,並且給不同的服務端分配manifest呢?puppet使用叫做node的語法來做這個事情,node 後面跟客戶端的主機名3,例如下面的例子:
|
結點。比如沒有針對host3的node配置,host3就用default的配置了。在這裡include的意思是include 類。同樣,節點也支援繼承。
4、變數和陣列
a、變數:
puppet也和其他語言一樣,支援變數和陣列,puppet用$符號定義變數,變數的內容用雙引號括起來。例如 :
|
- puppet可以使用由facter提交的變數,facter在客戶端收集系統資訊整理成不同的變數提交給puppet伺服器端,伺服器端的程式碼可以使用這些變數實現高階的功能,例如不同的硬體配置生成不同的應用軟體配置檔案。
- 執行facter命令可以看到很多變數的輸出,這些變數可以在puppet程式碼裡面直接使用。
b陣列:
puppet利用方括號來定義陣列,陣列的內容由逗號分割,例如下面的例子:
[ " apache2 " , " httpd " , " ssh " ]
陣列可以用在資源定義裡面,例如前面提到的例子。也可以用在函式裡面,例如:
|
變數也有有效範圍,同其他語言一樣分為區域性和全域性變數,簡單說來,就是在裡面定義的變數的使用範圍就限制在裡面。
5、模組
- 一個模組就是一個/etc/puppet/modules目錄下面的一個目錄和它的子目錄,在puppet的主檔案site.pp裡面用import modulename可以插入模組。新版本的puppet可以自動插入/etc/puppet/modules目錄下的模組。
- 引入模組,可以結構化程式碼,便於分享和管理。例如關於apache的所有配置都寫到apache模組下面。
- 一個模組目錄下面通常包括三個目錄:files,manifests,templates。manifests 裡面必須要包括一個init.pp的檔案,這是該模組的初始(入口)檔案,匯入一個模組的時候,會從init.pp開始執行。可以把所有的程式碼都寫到init.pp裡面,也可以分成多個pp檔案,init 再去包含其他檔案。files目錄是該模組的檔案釋出目錄,puppet提供一個檔案分發機制,類似rsync的模組。templates 目錄包含erb模型檔案,這個和file資源的template屬性有關。
- puppet安裝好以後,modules目錄是沒有的,自己建立一個就行,然後在裡面可以新增加你的模組。
常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
1、常用命令:
1. `puppet master` #編譯配置檔案、模板、節點的自定義外掛
2. `puppet agent` #客戶端程序,負責從Master獲取資料
3. `puppet cert` #證書頒發,用於簽署證書
4. `puppet kick` #遠端控制agent,遠端觸發puppet agent命令
5. `puppet apply` #執行本地manifests
2、幫助:
1. `puppet doc` #生成puppet文件
2. `puppet help` #顯示puppet幫助資訊
3. `puppet resource` #檢視資源幫助
4. `puppet describe` #資源幫助
5. `puppet status` #檢視puppet狀態
3、模組和不常用命令:
1. `puppet module` #從puppet forge建立、安裝、查詢模組
2.` puppet device` #遠端管理網路裝置
3. `puppet inspect` #傳送report報告
4. `puppet filebucket` #在filebucket中檢索和儲存檔案
5. `puppet queue` #佇列程序
例項操作
啟動
[[email protected]]# /etc/init.d/puppetmaster start
認證:
客戶端傳送請求 Puppeted --test –server testsns (testsns為client名稱) 伺服器檢視 Puppetca –list 伺服器端簽名 Puppetca –s –a //對所有客戶端全部簽名 Puppetca –s nfstest //只簽名某個客戶端 (nfs test為client名稱)
1、檔案分發:
通過puppet可以向被管理機上推送檔案,方法是使用file型別的source屬性 1:修改/etc/puppet/fileserver.conf 2:修改/etc/puppet/manifests/ site.pp 例項:要把server伺服器上/opt目錄下的mysql-5.1.49-linux-i686-icc-glibc23.tar.gz傳輸至client伺服器的/opt目錄下,檔名不變。第一步:
Vi /etc/puppet/fileserver.conf [files] path /opt/ allow 192.168.133.0/24
第二步:
vi /etc/puppet/manifests/site.pp file { "/opt/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz": source => "puppet://$puppetserver/files/mysql-5.1.49-linux-i686-icc-glibc23.tar.gz", }
第三步:
在client客戶端執行更新命令 puppetd --test --server testsns
此處“$puppetserver”是puppet Server端的名稱,即hostname,網上教程都是在hosts裡指定。testnsns為client名字
2、修改檔案屬性:
例項:把/tmp/dd142/ puppet-2.6.13.tar.gz檔案的許可權改為puppet使用者,並設定許可權為666。 第一步:
編輯Server端的site.pp vi /etc/puppet/manifests/site.pp ---內容如下 file { "/tmp/dd142/puppet-2.6.13.tar.gz": owner => "puppet", group => "puppet", mode => 666, }
第二步:
在client端執行命令
puppetd --test --server testsns
3、執行SHELL命令或shell指令碼:
例項:通過puppet分發執行shell指令碼,在客戶端的opt目錄下新建一目錄shelldir。 第一步:
編輯Server端的site.pp vi /etc/puppet/manifests/site.pp
exec { "exec-mkdir": cwd => "/opt", command => "sh /opt/lgh.sh", user => "root", path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin", }
第二步:
在client端編輯一shell指令碼
vi /opt/lgh.sh
#!/bin/bash
mkdir /opt/shelldir
第三步:
在client端執行命令 puppetd --test --server testsns
案例:Hello World
例項:一個slave從master中獲取其manifest,該maniftest要求slave依次做以下工作:安裝gcc,建立資料夾/home/dxc/test,下載檔案hello.c程式,編譯hello.c。
(1) 假設程式碼結構組織
Master上程式碼的目錄結構如下:
|– auth.conf
|– fileserver.conf #puppet檔案伺服器配置檔案
|– manifests #puppet主檔案所在目錄
| |– modules.pp #puppet各個模組彙總
| |– nodes #各個slave要處理的模組
| | `– execHello.pp #hello模組對應由那些slave處理
| `– site.pp #puppet主檔案(入口檔案)
|– modules #puppet的各個模組所在檔案
| `– hello #hello模組
| |– files #該模組對應的檔案資源,可能是要傳送給slave的配置檔案等
| | `– hello.c
| `– manifests #模組的manifest檔案
| `– init.pp #模組入口檔案
`– ssl #puppet的證書檔案目錄
(2) 程式執行流程
程式碼呼叫順序是:
Slave發起連線請求 =》site.pp =》nodes =》modules =》init.pp
首先,slave向發起master連線請求,進行證書驗證;
接著,證書驗證通過後,master會直接找到入口檔案manifests目錄下的site.pp檔案,該檔案可能包含一些全域性變數,引數預設值(當各個模組沒有設定這些引數時,它們的預設值)以及其它pp檔案的呼叫(在該例子中,會呼叫modules.pp和nodes下的各個pp檔案);
然後,master通過nodes下的各個pp檔案定位到該slave要執行的模組(init.pp是各個模組的入口),彙總這些模組程式碼返回給slave;
最後,slave根據master發過來的manifest,配置資訊。