1. 程式人生 > >puppet簡介、安裝配置、語法、命令與例項

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、類

類可以把多個相關的資源定義在一起,組成一個類,類可以繼承。

c l a s s   ssh {

f i l e    {

" / e t c / ssh / sshd_config " :

source  =>   " puppet : / / $ f i l e s e r v e r / ssh / sshd_config

. cfg " ;

}

package   {

" ssh " :

ensure  =>   i n s t a l l e d ;

}

s e r v i c e    {

" ssh " :

ensure  =>  running ;

}

}

這裡,file/etc/ssh/sshd_config的內容是從puppet伺服器上面下載的,file資源的內容可以從

別的url得到,也可以erb模板生成,erb模板是很強大的工具,這個後面會說到。package

資源安裝ssh軟體,service資源保證ssh服務在執行狀態。類的繼承這裡就不講了,因為是

入門手冊,另外用的不多。

b、函式

函式(在puppet中稱為“defination”)可以把多個資源包裝成一個資源,或者把一個資源包裝成一個模型,便於使用。

例如,在debian裡面管理一個apache虛擬機器非常簡單,把一個虛擬主機的配置檔案放到/etc/sites-available/裡面,

然後做一個符號連結到/etc/sites-enabled目錄。 

你可以為你每個虛擬主機複製同樣的配置程式碼,但是如果你使用下面的程式碼就會更好和更簡單:

define virtual_host($docroot$ip$order 500$ensure = “enabled”) {

$file = “/etc/sites-available/$name.conf”

# The template fills in the docroot, ip, and name.

file { $file:

content => template(“virtual_host.erb”),

notify  => Service[apache]

}

file { “/etc/sites-enabled/$order-$name.conf”:

ensure => $ensure ? {

enabled  => $file,

disabled => absent

}

}

}

然後,你就可以使用這個定義來管理一個apache虛擬主機,如下面程式碼所示:

virtual_host { “reductivelabs.com”:

order   => 100,

ip      => “192.168.0.100″,

docroot => “/var/www/reductivelabs.com/htdocs”

3、節點

puppet如何區分不同的客戶端,並且給不同的服務端分配manifest呢?puppet使用叫做node的語法來做這個事情,node 後面跟客戶端的主機名3,例如下面的例子:

node ' host1 . example . com ' {

i n c l u d e ssh

}

node ' host2 . example . com ' {

i n c l u d e apache , mysql , php

}

結點。比如沒有針對host3的node配置,host3就用default的配置了。在這裡include的意思是include 類。同樣,節點也支援繼承。

4、變數和陣列

a、變數:

puppet也和其他語言一樣,支援變數和陣列,puppet用$符號定義變數,變數的內容用雙引號括起來。例如 :

$ t e s t=" h e l l o , guys "

f i l e {

" /tmp/ t e s t " :

content => $ t e s t ;

}

  • puppet可以使用由facter提交的變數,facter在客戶端收集系統資訊整理成不同的變數提交給puppet伺服器端,伺服器端的程式碼可以使用這些變數實現高階的功能,例如不同的硬體配置生成不同的應用軟體配置檔案。
  • 執行facter命令可以看到很多變數的輸出,這些變數可以在puppet程式碼裡面直接使用。

b陣列:

puppet利用方括號來定義陣列,陣列的內容由逗號分割,例如下面的例子:

[ " apache2 " , " httpd " , " ssh " ]

陣列可以用在資源定義裡面,例如前面提到的例子。也可以用在函式裡面,例如:

d e f i n e php : : pear ( ) {

package { " `php

$ {name} " : ensure => i n s t a l l e d }

}

php : : pear { [ ' ldap ' ' mysql ' ' ps ' 'snmp ' ' s q l i t e ' ' t i d y ' , '

xmlrpc ' ] : }

變數也有有效範圍,同其他語言一樣分為區域性和全域性變數,簡單說來,就是在裡面定義的變數的使用範圍就限制在裡面。

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

[[email protected] ~]# puppet help

Usage: puppet <subcommand> [options] <action> [options]

Available subcommands, from Puppet Faces:

ca                Local Puppet Certificate Authority management. #管理本地證書

catalog           Compile, save, view, and convert catalogs. #編譯、儲存、檢視puppet程式碼,或轉換成Catalogs

certificate       Provide access to the CA for certificate management. #提供訪問CA證書的管理

certificate_request  Manage certificate requests. #管理證書的請求

certificate_revocation_list  Manage the list of revoked certificates. #管理撤銷證書的列表

config            Interact with Puppet's configuration options. #配置現象

facts             Retrieve and store facts. #系統資訊檢查

file              Retrieve and store files in a filebucket #在filebucket中檢索和儲存檔案

help              Display Puppet help. #檢視幫助

instrumentation_data  Manage instrumentation listener accumulated data. #管理監聽的資料

instrumentation_listener  Manage instrumentation listeners. #管理監聽的狀態

instrumentation_probe  Manage instrumentation probes. #管理監聽探測

key               Create, save, and remove certificate keys. #建立、儲存、刪除證書金鑰

man               Display Puppet manual pages. #檢視手冊

module            Creates, installs and searches for modules on the Puppet Forge. #從Puppet Forge建立、安裝、查詢模組

node              View and manage node definitions. #管理節點

parser            Interact directly with the parser. #解析器管理,檢查pp檔案語法

plugin            Interact with the Puppet plugin system. #外掛管理

report            Create, display, and submit reports. #建立、檢視報告

resource          API only: interact directly with resources via the RAL. #檢視資源幫助

resource_type     View classes, defined resource types, and nodes from all manifests. #檢視類、預設資源型別與節點資訊

secret_agent      Mimics puppet agent. #模擬Agent

status            View puppet server status. #檢視puppet狀態

Available applications, soon to be ported to Faces:

agent             The puppet agent daemon #客戶端程序,負責從Master端獲取資訊

apply             Apply Puppet manifests locally #執行本地manifests

cert              Manage certificates and requests #證書頒發,用於簽署證書

describe          Display help about resource types #資源幫助

device            Manage remote network devices #管理遠端網路裝置

doc               Generate Puppet documentation and references #生成puppet文件

filebucket        Store and retrieve files in a filebucket #在filebucket中檢索和儲存檔案

inspect           Send an inspection report #傳送report報告

kick              Remotely control puppet agent #遠端控制agent,遠端觸發puppet agent命令

master            The puppet master daemon #編譯配置檔案、模板、節點的自定義外掛

queue             Queuing daemon for asynchronous storeconfigs #佇列程序

See 'puppet help <subcommand> <action>' for help on a specific subcommand action.

See 'puppet help <subcommand>' for help on a specific subcommand.

Puppet v2.7.23 

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,配置資訊。