Linux之puppet

puppet简介

puppet是一套IT基础设施自动化管理工具,可以管理其整个生命周期,其官方网站:www.puppetlabs.org。其作者Luke Kanies成立了puppetLabs,于2005年发布0.2版本。puppet基于ruby语言研发,puppet有声明性、基于模型的配置语言,其也有自己的配置编程言。

puppet的优势

  • 基于master/agent的认证机制

  • 不依赖于客户端系统的管理权限

  • 可实现配置自动推送给客户端

puppet的版本

  • 0.2

  • 0.24.X

  • 0.25.X

  • 0.26.X

  • 2.7.X(目前比较流行的版本)

  • 3.0

  • 3.7


puppet的工作原理

  • puppet是C/S架构

  • puppet agent通常运行为一个服务进程,其默认每半个小时向master发出一次连接请求

  • puppet agent并不直接访问任何manifest,而向master请求一个预编译的catalog文件

  • puppet master会为发出请求的agent读取一个名为”site manifest”的特殊manifest文件,并基于此编译一个catalog后发送给请求者

  • puppet agent在获取到catalog后,应用于本地文件

因此,基于此种工作架构,仅在master端提供一个或少量几个Manifest即可实现管理大量的节点,并能提供更加安全的工作过程

puppet的三个层次概念


资源抽象层(resource abstraction layre)

相似的资源被抽象成同一种资源“类型”,如程序包资源、用户资源及服务资源等
将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关心其具体是通过yum、pkgadd、ports或是其它方式实现
仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定nginx运行起来”而不是具体描述为“运行nginx命令将其启动起来


事务层(transaction layer)
定义资源的依赖关系


配置语言(configuration language)


puppet的术语


模块
是一个完整的功能,包含清单和清单所依赖的文件


站点清单
针对一台客户端,它所需要的所有模块


puppet程序的安装
客户端

yum install puppet facter

服务端

yum install puppet-server

puppet命令
用法格式:puppet [options] [options]


subcommand
agent
apply :在本地运行清单
ca :管理本地CA
catalog : 查看catalog文件
config : 交互完成puppet配置
describe : 用来显示资源类型的帮助


获取所支持的所有资源类型


puppet describe -l

查看资源的使用帮助

puppet describe Resource_Type

定义资源常见语法
type {"title":
    attribute => value,
    attribute => value,
}

注意:type必须小写, tile在同一类型下必须唯一
puppet资源类型
group资源类型


allowdupe : 是否允许使用相同的GID号

ensure
present : 建立
absent : 删除


gid : 指定GID号

name : 组名,namevar,不显示定义就使用title

system : 是否为系统组
true
false


members : 成员

user资源类型


comment : 描述信息

ensure
present
absent


expiry : 过期时间

gid : 基本组ID

groups : 附加组

home : 家目录

keys : 指明密钥

name : namevar,不显示定义就使用title

password : 密码

salt : 密码的salt

shell : 默认shell

uid : UID

system : 是否为系统用户
true
false


1、puppet添加组及用户的示例:

group {'hadoop':
        ensure => present,
        gid => 200,
        system => true,
}

user {'docker':
        ensure => present,
        uid => 5000,
        system => false,
        groups => hadoop,
        home => "/home/docker",
        password => "zhenping.com",
        salt => 3kkxxkjfk,
        shell => "/bin/bash",
        comment => "docker virtual teach",
}
file资源类型


content : 直接给出文件内容,支持换行符和制表符

source : 从指定位置下载文件,可以是本地文件路径,也可以是远程服务端的路径

ensure
file : 文件
directory : 目录
link :连接文件
present
absent


force : 强行运行
true
false


group : 属组

owner : 属主

mode : 权限,可以使用ugo=rw或可以使用0664

replace  :覆盖

path : 路径

target : 当ensure为link时,target表示path指向的文件是一个符号连接文件,其目标为些target属性所指向的路径,此时content和source属性自动失效

2、远程文件复制示例:
file {"/etc/nfs.conf":
        source => [
                "puppet:///modules/nfs/conf.$host",
                "puppet:///modules/nfs/conf.$operatingsystem",
                "puppet:///modules/nfs/conf"
        ]
}


3、向文件中添加文本内容
file {"/tmp/puppet.txt":
        ensure => file,
        content => "This is a puppet write content .",
        owner => docker,
        group => docker,
        mode => 700,
        replace => true,
}

4、创建文件示例
file {"/tmp/test4.txt":
        ensure => present,
}

5、创建目录示例:
file {"/tmp/test":
        ensure => director,
}

6、创建软连接
file {"/tmp/fstab_test.link":
        ensure => link,
        target => "/etc/fstab",
}
    将/tmp/fstab_test.link 连接至/etc/fstab
exec资源类型
使用特性

命令本身具有幂等性
资源有onlyif、unless、creates等属性以实现命令的条件式运行
资源有refreshonly属性,以实现只有订阅的资源发生变化时才执行

常用属性


command : 运行的命令,namevar ,也可以在title上直接定义

creates : 此属性指定的文件不存在时才执行命令

cwd : 在此属性指定的路径下运行命令

environment : 命令运行的环境变量,可以直接定义一个path

group : 以指定的组运行命令

user : 以指定的用户身份运行命令

onlyif : 仅在此命令执行成功(返回状态码为0)时,才运行command指定的命令

unless : 仅在此命令执行失败(返回状态码非0)时,才运行command指定的命令

refresh: 默认是执行command中定义的命令,当接受到其它资源发来的Notify时,即会执行refresh后面指定的命令

refreshonly : 仅在订阅的资源运行成功后,才运行此资源
true
false


returns : 期望的状态返回值,返回非此值时表示命令执行失败

timeout : 命令执行超时时长

tries : 尝试执行的次数,默认为1次

path : 指明命令搜索路径,其功能类似path环境变量,不定义此属性,则必须给定命令的绝对路径

7、判断ext4模块是否被装载,如果未装载执行装载操作
exec {"modprobe ext4":
    path => ["/usr/lib64/qt-3.3/bin","/usr/local/sbin","/usr/local/bin","/usr/sbin","/usr/bin:/root/bin"],   #导出PATH环境变量
    unless => "lsmod | grep ext4",  #当此操作发现未找到ext4模块,返回代码非零,才执行装载操作
}

8、判断ext4模块是否在,如果存在才被装载
exec {"modprobe ext4":
    path => ["/usr/lib64/qt-3.3/bin","/usr/local/sbin","/usr/local/bin","/usr/sbin","/usr/bin","/root/bin"],
    onlyif => "modinfo ext4",  #此命令返回状态码为0时,才执行Modprobe的命令
}


9 当用户创建成功时,才生成weizi.notify的文件
group {"weizi":
    ensure => present,
    gid => 10000,
    notify => User["weizi"],
}
user {"weizi":
    ensure => present,
    uid => 10000,
#   notify => Exec["/bin/echo hello > /tmp/weizi.notify"],
}

exec {"/bin/echo hello > /tmp/weizi.notify":
    subscribe => User["weizi"],
    refreshonly => true,
}


exec {‘/bin/echo hello > /tmp/hello.txt’:
            user => root,
            group => root,
            creates => ‘/tmp/hello.txt’,
        }


exec {‘/bin/echo hello > /tmp/hello2.txt’:
            user => root,
            group => root,
            unless => ‘/usr/bin/test -e /tmp/hello2.txt’,
        }
notify资源类型
显示通知信息
nofify {"hello world":}
cron资源类型
管理计划任务
常用选项


command : 要运行的job

ensure
present
absent


user : 运行任务的用户

name : 任务计划的名称
target

hour : 小时

minute : 分钟

month    : 月

monthday : 每月的第几天

weekday : 每周几

environment : 运行时的环境变量

10、建立系统时间同步任务
cron {"sync time":
    command => "/usr/sbin/ntpdate 172.16.0.1 &> /dev/null",
    hour => "18",
    minute => "28",
}

[root@Centos7 manifests]# crontab -l
# Puppet Name: sync time
28 18 * * * /usr/sbin/ntpdate 172.16.0.1
package资源类型
管理程序包的安装、卸载、升级等
常用选项


ensure
installed
present
absent
purged
held


discription : 描述信息

configfiles : 配置文件
keep
replace


install_options : 安装选项

name : 程序包名称

status : 状态

source : 程序包的来源,可以本地文件路径或URL

provider : 使用什么方式安装,如安装rpm命令来安装
rpm


    vim test7.pp
package {‘zsh’:
            ensure => latest,
        }

package {‘jdk’:
            ensure => installed,
            source => ‘/usr/local/src/jdk-8u25-linux-x64.rpm’,
            provider => rpm,
        }
service资源类型
实现服务管理
常用选项


binary : 二进制程序文件路径

enable : 是否开机自动启动
true
false
manual


ensure
stopped
running


hasrestart : 服务脚本是否支持restart参数
true
false


hasstatus : 服务脚本是否支持status参数
true
false


name : 服务的名称,namevar

path : 服务脚本的搜索路径

pattern : 用于搜索此服务相关进程的模式,通过匹配进程名称确定服务是否正常运行

restart : 用于执行重启的命令

start : 用于执行开始的命令
status
stop

11、安装Nginx软件包,且定义配置文件及服务启动设置
package {"nginx":
    ensure => latest,
} ->
file {"/etc/nginx/nginx.conf":
    source => "/tmp/nginx.conf",
    owner => "nginx",
    group => "nginx",
    notify => Service["nginx"],
}
service {"nginx":
    ensure => running,        #定义服务运行状态
    enable => true,    #定义是否开机自启
    hasrestart => true,    #nginx支持restart参数
    hasstatus => true,
    path => "/usr/lib/systemd/system",    #服务脚本搜索路径
    restart => "systemctl reload nginx.service",     #定义restart的方式
}
三种特殊属性之metaparameters
定义依赖关系

被依赖的资源中使用before

依赖其它的资源中使用require

定义链式依赖->


定义通知关系

被依赖的资源中使用notify

监听其它资源使用notify

定义链式通知使用->


资源引用


Type["tiele"]   : type首字母一定要大写,如User["zhenping"]

12、定义资源的依赖关系

group {"linux":
    gid => 2001,
    ensure => present,
    before => User["linux"],
}

user {"linux":
    ensure => present,
    uid => 2001,
    gid => 2001,
    shell => "/bin/bash",
    home => "/home/linux",
    system => false,
    password => "zhenping.com”,
    salt => "zhenping",
    require => Group["linux"],
}


13、定义通知关系和依赖关系
package {"nginx":
    ensure => latest,
    allow_virtual => false,
    before => File["/etc/nginx/nginx.conf"],
}

file {"/etc/nginx/nginx.conf":
    source => "/tmp/nginx.conf",
    owner => nginx,
    group => nginx,
    require => Package["nginx"],
    notify => Service["nginx"],
    ensure => file,
}
service {"nginx":
    ensure => running,
    enable => true,
    hasrestart => true,
    hasstatus => true,
    restart => "systemctl reload nginx",
    path => "/usr/lib/systemd/system",
    require => [Package["nginx"],File["/etc/nginx/nginx.conf"]],
    subscribe => File["/etc/nginx/nginx.conf"],
}

14、定义链式依赖关系:
package {"nginx":
    ensure => latest,
    allow_virtual => false,
    before => File["/etc/nginx/nginx.conf"],
} ->

file {"/etc/nginx/nginx.conf":
    source => "/tmp/nginx.conf",
    owner => nginx,
    group => nginx,
    ensure => file,
} ->
service {"nginx":
    ensure => running,
    enable => true,
    hasrestart => true,
    hasstatus => true,
    restart => "systemctl reload nginx",
    path => "/usr/lib/systemd/system",
}


示例二、
$webserver = $operatingsystem ? {
    /^(?i-mx:ubuntu|debian)/ => "apache2",
    /^(?i-mx:centos|redhat)/ => "httpd",
}

package {$webserver:
    ensure => latest,
    allow_virtual => false,
}
file {"/etc/httpd/conf/httpd.conf":
    source => "/tmp/httpd.conf",
    ensure => file,
}
service {$webserver:
    ensure => running,
    enable => true,
    restart => "systemctl restart httpd",
    path => "/usr/lib/systemd/system",
    subscribe => File["/etc/httpd/conf/httpd.conf"],
}
puppet变量及作用域
变量
puppet变量名称必须以$开头,赋值操作符为"=",任何非正则表达式类型的数据均可赋值变量,puppet的每个变量都有两个名字,简短名称和长格式完全限定名称
作用域
定义代码的生效范围,以实现代码单隔离

仅能隔离: 变量,资源的默认属性
不能隔离: 资源的名称,及引用

每个变量两种引用路径

相对路径 :$name
绝对路径 :$::scope::scope:variable

变量的赋值符号

=
+=

变量中的种类

自定义变量

facter变量 : 可直接引用,可以使用facter -p命令查看

内置变量
客户端内置
$clientcert
$clientversion


服务端内置
$servername
$serverip
$serverversion
$module_name



变量的使用示例
$webserver=nginx
package {$webserver:
    ensure => latest,
}
puppet支持的数据类型


字符型
可以不用引用,支持单引号(强引用,不做变量替换),双引号(弱引用 )


布尔型
其值为true,false


undef
未声明的变量,直接定义使用的


数值型
整数和浮点数


数组
元素可为任意可用数据类型,包括数据和hash,索引从0开始,还可以使用负数,表示方式为`[item1,item2,...]


hash
键为字符串,而值可以是任意数据类型,表示方式为{key => value,key => value,...}


正则表达式
非标准数据类型,不能赋值给变量,其语法格式表示如下:


(?:)
(?-:)

OPTIONS
    i : 忽略字符大小写
    m : 把 . 当换行符
    x : 忽略模式中的空白和注释
puppet表达式


比较操作符

==

!=
<
<=
>
>=
!~
=~
in


逻辑操作符

and
or
!


算术操作符

+
-
*
/

>> (左移位)

<< (右移位)


puppet条件判断语句
if判断语句
使用格式:
单分支:
if CONDITION {
    ....
}

双分支:
if CONDITION {
    ....
} else {
    ....
}

多分支:
if CONDITION {
    ....
} elsif CONDITION {
    ....
} else {
    ....
}
配置示例
if $operatingsystem =~ /^(?i-mx:(redhat|centos))/ {
    package {"nginx":
        ensure => latest,
        allow_virtual => false,
    }

    service {"nginx":
        ensure => running,
        enable => true,
        hasrestart => true,
        hasstatus => true,
        restart => "systemctl reload nginx",
        path => "/usr/lib/systemd/system/",
    }
}


if $processorcount >1 {
    notice (“SMP Host.”)
} else {
    notice (“pool Guy.”)
}

if $operatingsystem =~ /^(?i-mx:(redhat|centos|fedora))/ {
    notice("welcom to $1 distribution linux.")
}

注意:此处的$1表示后向引用 ,引用括号中匹配到的内容
case判断语句
语句格式:
case CONTROL_EXPRESSION {
    case1, case2: { statement }
    case3, case4: { statement }
    default:      { statement }

}

CONTROL_EXPRESSION可以是以下格式:
1、表达式
2、变量
3、函数(有返回值)

case可以是:
1、字符串
2、变量
3、正则表达式
4、函数(有返回值)
5、default
selector语句
语句格式:
CONTROL_VARIABLE ? {
    case1 => value1
    case2 => value2
    ...
}

注意:selector不能用于一个已经嵌套于selector的case中,也不能用于一个已经嵌套于case的case语句中

类似于case,但分支的作用不在于执行代码片段,而是返回一个直接值
配置示例
$webserver = $operatingsystem ? {
    /^(?i-mx:ubuntu|debian)/ => "apache2",
    /^(?i-mx:centos|redhat)/ => "httpd",
}
puppet类(class)
用于公共目的的一组资源,是命名的代码块,创建后可在puppet全局进行调用
类的特性

类可以被继承
类的名称只能包含小写字母、数字、下划线且必须以小写字母开头
每个类都会引入一个新的变量scope,需要访问类的变量时,都得使用完全限定名称
在本地scope可以重新为top scope中的变量赋予一个新值

类的声明方式
定义好的类需要声明后才会被执行
类的声明方式一

include class_name,class_name,...

示例:
class webserver {
    $webserver = $operatingsystem ? {
        /^(?i-mx:ubuntu|debian)/ => "apache2",
        /^(?i-mx:centos|redhat)/ => "httpd",
    }

    package {$webserver:
        ensure => latest,
        allow_virtual => false,
    }
    file {"/etc/httpd/conf/httpd.conf":
        source => "/tmp/httpd.conf",
        ensure => file,
    }
    service {$webserver:
        ensure => running,
        enable => true,
        restart => "systemctl restart httpd.service",
        path => "/usr/lib/systemd/system/",
        subscribe => File["/etc/httpd/conf/httpd.conf"],
    }

}
include webserver  #直接调用webserver类
类的声明方式二


class {'base::linux'} : 此声明为一个子类,或者如下申明方式(给类传递参数):

class {"class_name":
    variable => value,
}
示例
class httpd($webserver='nginx') {   #此处的变量定义为默认值,当未在声明中设定变量值,就使用默认的变量值

    package {$webserver:
        ensure => latest,
        allow_virtual => false,
    }
    file {"/etc/httpd/conf/httpd.conf":
        source => "/tmp/httpd.conf",
        ensure => file,
    }
    service {$webserver:
        ensure => running,
        enable => true,
        subscribe => File["/etc/httpd/conf/httpd.conf"],
    }

}
class {"httpd":
    webserver => "httpd", #在类声明的时候,给类传递一个参数
}
类的继承

声明子类时,其基类会被自动首先声明
基类成为子类的父作用域,基类中的变量和属性默认值会被子类复制一份
子类可以覆盖父类中同一资源的相同属性的值

通常将公共功能定义为基类,需要增加的功能定义为子类,其继承一个已有的类,并实现覆盖资源属性,或向资源属性追加额外值

使用如下定义符:

=> : 定义新的值

+> : 添加值


    class apache {
      service {'apache':
        require => Package['httpd'],
      }
    }

    class apache::ssl inherits apache {
      Service['apache'] {
        require +> [ File['httpd.pem'], File['httpd.conf'] ],
      }
    }
继承类的定义方式
class base_class {
    ....puppet code....
}

class base_class::class_name inherits base_class {
    ....puppet code....
}
使用示例
class nginx {
    package {"nginx":
        ensure => latest,
        allow_virtual => false,
    }
}

class nginx::webserver inherits nginx {
    file {"/etc/nginx/nginx.conf":
        source => "/tmp/nginx.conf",
        owner => nginx,
        group => nginx,
        mode => 0644,
        ensure => file,
        require => Package["nginx"],
    }

    service {"nginx":
        ensure => running,
        enable => true,
        restart => "systemctl reload nginx",
        path => "/usr/lib/systemd/system/",
        hasstatus => true,
        hasrestart => false,
        subscribe => File["/etc/nginx/nginx.conf"],
    }
}

class nginx::proxy inherits nginx {
    file {"/etc/nginx/nginx.conf":
        source => "/tmp/proxy/nginx.conf",
        owner => nginx,
        group => nginx,
        ensure => file,
        mode => 0644,
        require => Package["nginx"],
    }

    service {"nginx":
        ensure => running,
        enable => true,
        restart => "systemctl reload nginx",
        path => "/usr/lib/systemd/system",
        hasstatus => true,
        hasrestart => false,
        subscribe => File["/etc/nginx/nginx.conf"],
    }
}

include nginx::webserver
puppet模板
基于ERB(扩展ruby语言)模板语言,在静态文件中使用变量等编程元素生成适用于多种不同环境的文本文件(配置文件),主要用于实现在文本文件中嵌入ruby代码,原来的文件信息不会被改变,但ruby代码会被执行,执行结果将直接替换原来代码
模板代码的添加方式


<%= ruby expression %> : 替换为表达式的值

<% ruby expression %> : 仅执行代码,而不替换

<%# comment %> : 文本注释

<%% :做转义,输出为<%

%%> :做转义,输出为%>

<%- rubycode %> : 忽略空白字符

<% rubycode -%> : 忽略空白行

在模板中可以使用变量,包括puppet的任意可用变量,但变量名需以@字符开头
模板中的条件判断


单分支判断语句
  <% if CONDITION -%>
      some text
  <% end %>


多分支判断语句
  <% if CONDITION -%>
      some text
  <% else %>
      some other text
  <% end %>


模板中的迭代实现
模板的中的迭代是为了实现某配置文件中批量添加生成配置信息,如配置nginx中的Location时,当有多个Location段需要添加,可以将location赋值给一个数组,利用迭代将值引用到配置文件中。

定义格式

<% @ArrayName.echo do | Variable_name | -%>
    some text with <%= Variable_name %>
<% end %>
模板文件的定义示例:
1、配置模板配置文件
vim /tmp/nginx.conf
worker_processes <%= @processorcount %>;  #此处变量为facter中的变量,可以直接引用

2、puppet脚本配置语言
vim nginx.pp
class nginx {
    package {"nginx":
        ensure => latest,
        allow_virtual => false,
    }
}

class nginx::webserver inherits nginx {
    file {"/etc/nginx/nginx.conf":
  #如果定义好的配置文件,使用了ERB的配置语法,此处文件复制不能使用source,而是需要使用content参数,利用template函数生成对应的配置文件,此为固定格式用法(将使用template函数生成文本内容,再导入至/etc/nginx/nginx.conf文件中)
        content => template("/tmp/nginx.conf"),
        owner => nginx,
        group => nginx,
        mode => 0644,
        ensure => file,
        require => Package["nginx"],
    }

    service {"nginx":
        ensure => running,
        enable => true,
        restart => "systemctl reload nginx",
        path => "/usr/lib/systemd/system/",
        hasstatus => true,
        hasrestart => false,
        subscribe => File["/etc/nginx/nginx.conf"],
    }
}
include nginx::webserver
puppet模块
在puppet中,模块本身用一个目录来表示,其需要存放于puppet的modulepath参数所定义的目录中,如/etc/puppet/modules。在manifests/init.pp需定义一个与模块名相同的类名,以完成自包含、自装载、自识别
模块目录组成格式


/etc/puppet/modules/ : 模块存放的默认路径,在此目录下建立相应的模块目录即可

module_name/ : 模块名称

manifests/ : 资源清单目录

init.pp : 默认的资源定义文件,此文件必须存在


files : 静态配置文件存放路径

templates : ERB模块配置文件存放路径,其文件结束后缀为.erb


lib : 插件目录

tests:当前模块的使用帮助文件及示例文件

spec :  类似于tests目录,存储lib目录下定义的插件的使用帮助和示例文件



    ```
    示例:
    [root@Centos7 manifests]# tree /etc/puppet/modules/
    /etc/puppet/modules/
    `-- nginx
    |-- files
    |   `-- nginx.conf
    |-- lib
    |-- manifests
    |   `-- init.pp
    |-- spec
    |-- templates
    |   `-- nginx.conf.erb
    `-- tests

    [root@Centos7 manifests]# cat init.pp
    class nginx {
        package {"nginx":
            ensure => latest,
            allow_virtual => false,
        }
    }

    class nginx::webserver inherits nginx {
        file {"/etc/nginx/nginx.conf":
            content => template("nginx/nginx.conf.erb"),  #模板文件定义的路径为“模块名/erb文件”
            owner => nginx,
            group => nginx,
            mode => 0644,
            ensure => file,
            require => Package["nginx"],
        }

        service {"nginx":
            ensure => running,
            enable => true,
            restart => "systemctl reload nginx",
            path => "/usr/lib/systemd/system/",
            hasstatus => true,
            hasrestart => false,
            subscribe => File["/etc/nginx/nginx.conf"],
        }
    }

    class nginx::proxy inherits nginx {
        file {"/etc/nginx/nginx.conf":
            source => "puppet:///modules/nginx/nginx.conf", #配置文件路径路径为"协议:///modules/模块名/静态配置文件"
            owner => nginx,
            group => nginx,
            ensure => file,
            mode => 0644,
            require => Package["nginx"],
        }

        service {"nginx":
            ensure => running,
            enable => true,
            restart => "systemctl reload nginx",
            path => "/usr/lib/systemd/system",
            hasstatus => true,
            hasrestart => false,
            subscribe => File["/etc/nginx/nginx.conf"],
        }
    }
    ```
模块管理工具
puppet module 命令


puppet help module :获取puppet module的帮助信息

Usage : puppet module [--environment production ] [--modulepath $basemodulepath ]

install : 到puppet forge中心安装模块

list : 查看已安装的模块

search : 到forge中心搜索模块

uninsall : 卸载模块

upgrade : 更新模块



puppet Master/Agent模式
master/agent工作原理
master/agent强依赖于DNS服务(证书签署是对FQDN做证书颁发的),由master端定义好功能模块,再到/etc/puppet/manifests/定义site.pp文件,定义站点所需要的资源。master端通过自建CA并签发证书给各站点,使用证书验证客户端的身份,当站点发出请求时Master端将查找site.pp文件中定义的资源,编译成catalog,发送给客户端。 agent默认每隔30分钟向Master发送node_name和facts,并请求catalog,在本地执行catalog代码。master与agent二者之间基于https协议通信,其远程过程调用方式为xmlrpc机制。
master/agent程序安装

master端

yum install puppet puppet-server facter (如果master端不需要对自己管理时,可以不需要安装puppet)


agent端
yum install puppet facter


master/agent监听端口

master : 8140/tcp
agent : 8139/tcp

/etc/puppet/puppet.conf配置文件


[main] : 应用于server端和agent端,都会生效

[agent] : 应用于agent端生效

显示或配置参数


puppet config print : 打印puppet的配置选项(对master/agent都生效)

puppet config set key=value : 设置puppet的配置选项(对mster/agent都生效)

注意:此些值的修改是对/etc/puppet/puppet.conf文件生效
手动生成配置文件

master端

        puppet master —genconfig > /etc/puppet_default.conf
        mv /etc/puppet/puppet.conf /etc/puppet/puppet.conf.bak
        mv /etc/puppet_default.conf /etc/puppet.conf

agent端

puppet agent —genconfig >> /etc/puppet.conf (可以追加,在agent端使用覆盖)

生成配置文件的注意事项

1、生成新的配置之前不能删除或移动原有的puppet.conf
2、生成的配置中,有的参数已经被废弃,与现有puppet版本可能不兼容
3、有的参数的默认值与现在的版本所支持值可能不相兼容
4、配置信息可以不使用此工具生成,可以直接在配置文件中添加
Master/agent服务管理

master端
systemctl start puppet-server.service


agent端
systemctl start puppet.service


(puppet cert命令)证书管理工具


Usage: puppet cert [-h | --help]

action
clean node_name : 清除node_name节点的证书
list : 查看未签署的证书请求
list -all : 查看所有证书
sign "node_name" : 对node_name签署证书
sign -all : 签署所有证书请求
verify : 检验



site.pp定义站点调用的模块

以主机名直接给出其相关定义

node 'node_name' {
    ....puppet code....
    include nginx::webserver
}

把功能相近的主机名给出其相关定义

node /^web\d+\.magedu\.com/ {
    ....puppet code...
    include nginx::webserver
}

节点的继承

node "basenode" {
    include ntp
}

node "web.zhenping.com" inherits basenode {
    include nginx::proxy
}
对节点配置分段管理
/etc/puppet/manifests/
    vim site.pp
    import "webserver/*.pp"

    webservers/
        unicom.pp
        telecom.pp
    cacheservers/
    appservers/
master/agent配置示例
1、配置master端
# puppet master --no-daemonize -v #首次以前台模式启动,确认无误再运行为后端
# systemctl start puppetserver.service
# systemctl enable puppetserver.service
# ss -tnlp : 8140/tcp

2、定义站点配置文件
# cd /etc/puppet/manifests/
# vim site.pp  #必须先为站点定义好站点文件,不然agent端启动时会报错
node /^centos7.pc\d+/ {
    include nginx::webserver
}

3、配置agent端(发送证书签署请求给Master)
# puppet agent --server=master_hostname --no-daemonize --noop --test -v #建议首次启动时以前台模式运行,确认OK后,再将运行为后端


4、在master端为客户端签署证书
# puppet cert list #首先查看未签署的证书列表
# puppet cert sign node_name
    或者
# puppet cert sing -all

5、以守护进程方式启动agent
# systemctl start puppet

####必要是清除客户端请求
#puppet cert list -all : 查看已经签署的客户端证书
# puppet cert clean node_name : 清除一个Node的签署证书

# rm -rf /var/lib/puppet/ssl : 移除agent端的ssl证书
master/agent的多环境支持
puppet的多环境支持:
    master端环境配置段:为不同的主机配置不同的配置
        [master]
        enviroment = production, testing, development   #声明master支持那些环境配置

        [production](生产环境)
        manifest = /etc/puppet/environments/production/manifests/site.pp
        modulepath = /etc/puppet/enviroments/production/modules/
        fileserverconfig = /etc/puppet/fileserver.conf

        [testing]
        manifest = /etc/puppet/environments/testing/manifests/site.pp
        modulepath = /etc/puppet/enviroments/testing/modules/
        fileserverconfig = /etc/puppet/fileserver.conf

        [development]
        manifest = /etc/puppet/environments/development/manifests/site.pp
        modulepath = /etc/puppet/enviroments/development/modules/
        fileserverconfig = /etc/puppet/fileserver.conf   

    agent端配置文件:
        [agent]
        enviroment = testing