Puppet是一種Linux、Unix平臺的集中配置管理系統,使用ruby語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。Puppet把這些系統實體稱之爲資源,Puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。
puppet是一個IT基礎設施自動化管理工具,它能夠幫助系統管理員管理基礎設施的整個生命週期: 供應(provisioning)、配置(configuration)、聯動(orchestration)及報告(reporting)。
基於puppet ,可實現自動化重複任務、快速部署關鍵性應用以及在本地或雲端完成主動管理變更和快速擴展架構規模等。
遵循GPL 協議(2.7.0-), 基於ruby語言開發。
2.7.0 以後使用(Apache 2.0 license)
對於系統管理員是抽象的,只依賴於ruby與facter。
能管理多達40 多種資源,例如:file、user、group、host、package、service、cron、exec、yum repo等。
puppet採用C/S星狀的結構,所有的客戶端和一個或幾個服務器交互。每個客戶端週期的(默認半個小時)向服務器發送請求,獲得其最新的配置信息,保證和該配置信息同步。每個puppet客戶端每半小時(可以設置)連接一次服務器端, 下載最新的配置文件,並且嚴格按照配置文件來配置客戶端. 配置完成以後,puppet客戶端可以反饋給服務器端一個消息. 如果出錯,也會給服務器端反饋一個消息.
Puppet工作流程
使用模型
puppet的使用模型分爲單機使用模型和master/agent模型
單機使用模型
實現定義多個manifests --> complier --> catalog --> apply
master/agent模型
master/agent模型實現的是集中式管理,即 agent 端週期性向 master 端發起請求,請求自己需要的數據。然後在自己的機器上運行,並將結果返回給 master 端。
從上面的圖,我們可以看到,Master接收到Agent的請求後,會查找自己的Manifests及相關的配置,並找到請求節點相關的內容,然後編譯成Catalog,發回給Agent執行。
這個過程大概有這樣幾個步驟:
1. Master加載配置文件
2. 查找節點定義,查看節點中聲明的資源和類
3. 查找到這些資源和類,編譯生成Catalog
puppet 名詞解釋
資源:是puppet的核心,通過資源申報,定義在資源清單中。相當於ansible中的模塊,只是抽象的更加徹底。
類:一組資源清單。
模塊:包含多個類。相當於ansible中的角色。
站點清單:以主機爲核心,應用哪些模塊。
操作篇:
操作環境:
192.168.80.181 | master.czm.com | ruby ruby-libs ruby-shadow puppet puppet-server facter ntp |
192.168.80.182 | client01.czm.com | puppet ntp |
192.168.80.183 | client02.czm.com | puppet ntp |
注:三臺主機均爲NAT模式
修改主機名:
hostnamectl set-hostname 主機名
exit 登出
重連即可
master:
搭建
systemctl stop firewalld && setenforce 0 //關閉防火牆及selinux
釋放網絡倉庫 重啓網卡使主機可以ping通外網ip
vi /etc/hosts
scp 發送給其他兩臺主機
yum install ntp -y //時間同步
ntpdate time1.aliyun.com //同步阿里雲網絡時間
yum install -y epel-release //安裝網絡源
yum -y install ruby ruby-libs ruby-shadow
yum -y install puppet puppet-server facter
vi /etc/puppet/puppet.conf //在[main]下新增
modulepath = /etc/puppet/modules:/usr/share/puppet/modules
systemctl start puppetmaster
systemctl enable puppetmaster //啓動服務以及開機自啓
netstat -anpt | grep 8140
client:(01和02搭建的環境基本一致)
關閉防火牆以及selinux ntp同步網絡時間 安裝epel源
yum install -y puppet
注:
其中主配置文件爲/etc/puppet/puppet.conf,使用的主程序爲/usr/bin/puppet。
可以使用puppet describe來打印有關Puppet資源類型,提供者和元參數的幫助。使用語法如下:
puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]
-l:列出所有資源類型;
-s:顯示指定類型的簡要幫助信息;
-m:顯示指定類型的元參數,一般與-s一同使用;
例子:
puppet describe -l -s -m
vi /etc/puppet/puppet.conf //在[agent]下添加,末尾添加
定義主服務器name
service puppet start
systemctl enable puppet
ps aux | grep pupp
——————————申請與註冊————————————
client上操作--接着在服務器上授權
在client上:申請註冊
puppet agent --server=master.czm.com --no-daemonize --verbose --debug
在master上:
puppet cert --list //查看申請的客戶端
puppet cert sign --all
//將未註冊的客戶端進行註冊
ll /var/lib/puppet/ssl/ca/signed/ //查看已經註冊的客戶端
注:認證報錯後
find /var/lib/puppet -type f -print0 |xargs -0r rm //刪除認證ssl
將刪除語句執行在了master主機上,客戶端連接報以下錯
重啓puppetmaster即可
到此申請完成
配置實例:
案例描述:
爲了保護linux的ssh端口,批量修改客戶端sshd端口,將22端口修改爲9922,並實現重啓工作。
注:配置文件內要注意格式 結尾不能多加空格行
1、創建必要的目錄
在master上:
mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files}
//創建ssh模塊,模塊下面有三個文件:manifests、templates和files
mkdir /etc/puppet/manifests/nodes //創建節點目錄
mkdir /etc/puppet/modules/ssh/files/ssh //創建ssh模塊目錄
chown -R puppet /etc/puppet/modules/
ll /etc/puppet/modules/ssh/
2、創建模塊配置文件install.pp
vi /etc/puppet/modules/ssh/manifests/install.pp //新建文件(首先確定客戶端安裝ssh服務)
class ssh::install{
package{"openssh":
ensure => present,
}
}
vi /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"],
}
}
vi /etc/puppet/modules/ssh/manifests/service.pp //新建文件
class ssh::service {
service {"sshd":
ensure=>running,
hasstatus=>true,
hasrestart=>true,
enable=>true,
require=>Class["ssh::config"]
}
}
vi /etc/puppet/modules/ssh/manifests/init.pp //新建文件
class ssh{
include ssh::install,ssh::config,ssh::service
}
ll /etc/puppet/modules/ssh/manifests/ //下面有四個文件
cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/
chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config //修改權限
vi /etc/puppet/manifests/nodes/ssh.pp
node 'client02.czm.com' {
include ssh
}
node 'client01.czm.com' {
include ssh
}
vi /etc/puppet/manifests/site.pp //新建文件
import "nodes/ssh.pp"
vi /etc/puppet/modules/ssh/files/ssh/sshd_config //修改(13)
Port 9922
service puppetmaster restart //重新啓動puppet
--------------client----客戶端主動拉取---------
puppet agent -t
cat /etc/ssh/sshd_config //驗證如下
Port 9922
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
從上圖,可以看出更換了ssh的端口。
netstat -tunlp| grep ssh //查看服務器ssh服務是否重啓,端口是否生效
5、配置服務器推送同步(客戶端)
vi /etc/puppet/puppet.conf //最後一行添加
listen = true
vi /etc/puppet/auth.conf //最後一行添加
allow *
service puppet restart //啓動puppet客戶端
cat /etc/ssh/sshd_config //查看
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
netstat -tunlp| grep ssh //確認啓動ssh服務
------------master---------------
puppet kick clientname //開始往客戶端推送
vi /etc/ssh/sshd_config //在clientname上查看,驗證如下
Port 9922
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
netstat -tunlp| grep sshd //在clientname上查看,查看服務器ssh服務是否重啓,端口是否生效
擴展:
管理系統上的用戶組
vim group.pp
group{'mygrp':
name => 'mygrp',
ensure => present,
gid => 2000,
}
說明:
name:組名,可以省略,如果省略,將繼承title的值;
gid:GID;
system:是否爲系統組,true OR false;
ensure:目標狀態,present/absent;
members:成員用戶;
管理系統上的用戶:
vim user1.pp
user{'keerr':
ensure => present,
system => false,
comment => 'Test User',
shell => '/bin/tcsh',
home => '/data/keerr',
managehome => true,
groups => 'mygrp',
uid => 3000,
}
說明:
name:用戶名,可以省略,如果省略,將繼承title的值;
uid: UID;
gid:基本組ID;
groups:附加組,不能包含基本組;
comment:註釋;
expiry:過期時間 ;
home:用戶的家目錄;
shell:默認shell類型;
system:是否爲系統用戶 ;
ensure:present/absent;
password:加密後的密碼串;
puppet的管理軟件包:
vim package1.pp
package{'nginx':
ensure => installed,
provider => yum
}
說明:
ensure:installed, present, latest, absent, any version string (implies present)
name:包名,可以省略,如果省略,將繼承title的值;
source:程序包來源,僅對不會自動下載相關程序包的provider有用,例如rpm或dpkg;
provider:指明安裝方式;
定義服務的狀態
vim service1.pp
service{'nginx':
ensure => true,
enable => false
}
說明:
ensure:服務的目標狀態,值有true(running)和false(stopped)
enable:是否開機自動啓動,值有true和false
name:服務名稱,可以省略,如果省略,將繼承title的值
path:服務腳本路徑,默認爲/etc/init.d/下
start:定製啓動命令
stop:定製關閉命令
restart:定製重啓命令
status:定製狀態
管理文件、目錄、軟鏈接:
vim file1.pp
file{'aaa':
path => '/data/aaa',
source => '/etc/aaa',
owner => 'keerr',
mode => '611',
}
說明:
ensure:目標狀態,值有absent,present,file,directory和link
file:類型爲普通文件,其內容由content屬性生成或複製由source屬性指向的文件路徑來創建;
link:類型爲符號鏈接文件,必須由target屬性指明其鏈接的目標文件;
directory:類型爲目錄,可通過source指向的路徑複製生成,recurse屬性指明是否遞歸複製;
path:文件路徑;
source:源文件;
content:文件內容;
target:符號鏈接的目標文件;
owner:定義文件的屬主;
group:定義文件的屬組;
mode:定義文件的權限;
atime/ctime/mtime:時間戳;
執行命令,慎用。通常用來執行外部命令:
vim exec1.pp
exec{'cmd':
command => 'mkdir /data/testdir',
path => ['/bin','/sbin','/usr/bin','/usr/sbin'],
# path => '/bin:/sbin:/usr/bin:/usr/sbin',
}
說明:
command(namevar):要運行的命令;
cwd:指定運行該命令的目錄;
creates:文件路徑,僅此路徑表示的文件不存在時,command方纔執行;
user/group:運行命令的用戶身份;
path:指定命令執行的搜索路徑;
onlyif:此屬性指定一個命令,此命令正常(退出碼爲0)運行時,當前command纔會運行;
unless:此屬性指定一個命令,此命令非正常(退出碼爲非0)運行時,當前command纔會運行;
refresh:重新執行當前command的替代命令;
refreshonly:僅接收到訂閱的資源的通知時方纔運行;
定義週期性任務:
vim cron1.pp
cron{'timesync':
command => '/usr/sbin/ntpdata 172.16.0.1',
ensure => present,
minute => '*/3',
user => 'root',
}
說明:
command:要執行的任務(命令或腳本);
ensure:目標狀態,present/absent;
hour:時;
minute:分;
monthday:日;
month:月;
weekday:周;
user:以哪個用戶的身份運行命令(默認爲root);
target:添加爲哪個用戶的任務;
name:cron job的名稱;