puppet

puppet
简介
资料
程序包下载路径:
https://yum.puppetlabs.com/
官方文档:
https://docs.puppet.com/puppet/3/reference/
内建函数:
https://docs.puppet.com/puppet/3/reference/function.html
配置参数列表:
https://docs.puppet.com/puppet/3/reference/configuration.html
对下层使用的工具进行再次封装,只对使用者提供资源
即实现方式与上层定义的资源是隔离的,即无需关心下层的实现方式,只需要在上层指定资源
资源的提供者
模块:对指定主机执行的任务,或任务集合,模块由资源组成
资源:可以进行的操作,
八种核心的资源类型:
group, user, package, service, file;exec, cron, notify;
使用agent对客户端进行管理
默认为请求服务端.主动拉取配置,也可在服务端进行手动推送,使客户端符合服务端对客户端的定义.
使用ssh进行加密的通信
使用基于ssh的http协议
连接使用证书进行验证,
并且是双向证书 .
当保证证书是可信的,可以开启自动签署功能
识别主机依靠的是主机中的主机名称
所以需要内网的DNS主机
子主题 3
支持证书管理功能,即使用 puppet进行证书创建等操作.
puppet可以分为两种模式
单机模式
C/S 模式
清单分类
资源清单
定义管控主机执行的的内容,资源清单由每一个资源组成即等同于ansible的一个任务
站点清单
定义管控的站点
三层模型
底层具体的实现
资源间的依赖关系
上层语言定义
运行方式
单机执行
apply

            定义资源清单
                编译
            单机执行
                拉取资源执行
        多机模型

master/agent

            当服务器作为master运行时,需要安装额外的软件包 puppet-server
    官方站点

www.puppet.com
安装
程序包组
puppet.noarch
主程序
puppet-firewalld.noarch
puppet-server.noarch
puppetlabs-stdlib.noarch
主程序安装
yum install puppet -y
帮助查询
puppet help
puppet-server安装
yum -y install puppet-server
/etc/puppet/fileserver.conf 文件服务器
/etc/puppet/manifests 主机清单
/usr/lib/systemd/system/puppetmaster.service
/usr/share/man/man8/puppet-kick.8.gz
/usr/share/man/man8/puppet-master.8.gz
/usr/share/man/man8/puppet-queue.8.gz
命令使用
帮助
puppet help
子命令的使用方式
puppet help 子命令
格式:
puppet [options] [options]
puppet 子命令 子命令选项 子子命令 子子命令选项
describe
puppet describe [-h|–help] [-s|–short] [-p|–providers] [-l|–list] [-m|–meta]
-l –list
列出所有支持的资源类型
-m –meta
列出所有的原参数
-s –short
列出所有的简短参数
-p –providers
列出具体实现方式
puppet describe 资源
查询资源的使用方法
如 : puppet describe package
puppet describe -s -m package
puppet describe -p package
apply
在本机执行命令
puppet apply [-h|–help] [-V|–version] [-d|–debug] [-v|–verbose]
[-e|–execute] [–detailed-exitcodes] [-l|–logdest ] [–noop]
[–catalog ] [–write-catalog-summary]
–noop : 测试运行,并不真正执行
-v : 显示详细信息
-d : 调试
-e : 调用类
puppet apply –modulepath=/root/dev/modules -e “include ntpd::server”
module
模块管理
list 显示模块
install 安装模块
uninstall 卸载证书
config
配置信息
puppet config [–section SECTION_NAME]
–section 指明操作的配置段 [main| master|agent]
print
打印配置
puppet config print
puppet config print 参数
显示具体参数
set
设定参数的值
puppet config set 参数 值
ca
配置ca信息
USAGE: puppet ca

This provides local management of the Puppet Certificate Authority.

OPTIONS:
–render-as FORMAT - The rendering format to use.
–verbose - Whether to log verbosely.
–debug - Whether to log debug information.

ACTIONS:
destroy undocumented action
fingerprint undocumented action
generate undocumented action
list List certificates and/or certificate requests.
print undocumented action
revoke undocumented action
sign undocumented action
verify undocumented action
list 列出带签署的证书
cert
管理证书
list 列出证书
-a 列出所有证书
puppet cert [–all|-a|]
action:
list
sign 签署
revoke 进吊销证书
clean:吊销指定的客户端的证书,并删除与其相关的所有文件;
kick
推送命令
puppet kick [-a|–all] [-c|–class ] [-d|–debug] [-f|–foreground]
[-h|–help] [–host ] [–no-fqdn] [–ignoreschedules]
[-t|–tag ] [–test] [-p|–ping] [ […]]
简单用法: puppet kick [–host ] [–all]
puppet kick jin1.baidu.com
资源清单
基本使用
查询: puppet describe 资源类型
puppet describe package
类型:具有类似属性的组件,例如package、service、file;
将资源的属性或状态与其实现方式分离;
仅描述资源的目标状态,也即期望其实现的结果状态,而不是具体过程;
https://docs.puppet.com/puppet/5.2/cheatsheet_core_types.html
格式
资源清单以.pp结尾
注意:type必须使用小写字符;title是一个字符串,在同一类型中必须惟一
在引用时 type的头一个字母大写
type {‘title’:
attribute1 => value1,
atrribute2 => value2,
……
}
type 资源的类型
title 同一类型中资源的标示符
资源属性中的三个特殊属性:
Namevar, 可简称为name;即在省略默认值的设定时,默认值为title定义的值
ensure:资源的目标状态;
Provider:指明资源的管理接口;
元参数
依赖关系元参数
即所有资源都默认存在的参数,
用于定义资源之间的依赖关系
before
A before B: B依赖于A,定义在A资源中;即定义在被依赖的资源中
{

before => Type[‘B’],

}

user {‘jinbus’:
ensure => present,
groups => mygroup,
shell => ‘/bin/tcsh’,
comment => ‘test user’,
system => true,
}

group {‘mygroup’:
ensure => present,
provider => groupadd,
befort => User[‘jinbus’],
}
~
require
B require A: B依赖于A,定义在B资源中;
{

require => Type[‘A’],

}
user {‘jinbus’:
ensure => present,
groups => mygroup,
shell => ‘/bin/tcsh’,
comment => ‘test user’,
system => true,
require => Group[‘mygroup’],
}

group {‘mygroup’:
ensure => present,
provider => groupadd,
}
简洁定义方法
在结尾使用 引用的方式 通过-> 表明依赖关系
Group[‘mygroup’] -> User[‘jinbus’] 被依赖的在括号的开口处
user {‘jinbus’:
ensure => present,
groups => mygroup,
shell => ‘/bin/tcsh’,
comment => ‘test user’,
system => true,
}

group {‘mygroup’:
ensure => present,
provider => groupadd,
}
Group[‘mygroup’] -> User[‘jinbus’]
在各个资源之间使用-> 表明依赖关系
user {‘jinbus’:
ensure => present,
groups => mygroup,
shell => ‘/bin/tcsh’,
comment => ‘test user’,
system => true,
} ->

group {‘mygroup’:
ensure => present,
provider => groupadd,
}
通知关系元参数
A notify B:
B被A通知,A通知B: 接受由A触发refresh; 即定义在改变的资源中,调用其他资源
B subscribe A:
B被A通知,B订阅A :接受由A触发refresh;即定义在调用的资源中,监控改变的资源

                    service {'redis':
    ensure          => running,
    enable          => true,
    hasrestart      => true,

subscribe =>File[‘/etc/redis.conf’],

}

file {‘/etc/redis.conf’:
source => ‘/root/redis.conf’,
owner => ‘redis’,
group => ‘root’,
ensure => ‘file’,

notify => Service[‘redis’],

}
File[‘/etc/redis.conf’] ~> Service[‘redis’]
file {‘/etc/redis.conf’:
source => ‘/root/redis.conf’,
owner => ‘redis’,
group => ‘root’,
ensure => ‘file’,
} ~>
service {‘redis’:
ensure => running,
enable => true,
hasrestart => true,
}
再次声明,puppet 的思想是使目标主机符合期望,所以,在默写已经符合期望的设定,再次执行时,将不在执行,只执行不符合期望的动作. 所以可以使用设定在不符合期望的设定执行时,代用已经符合期望的资源
package 安装程序

Meta Parameters

alias, audit, before, loglevel, noop, notify, require, schedule, stage,
subscribe, tag

Providers

aix, appdmg, apple, apt, aptitude, aptrpm, blastwave, dpkg, fink,
freebsd, gem, hpux, macports, msi, nim, openbsd, opkg, pacman, pip, pkg,
pkgdmg, pkgin, pkgutil, portage, ports, portupgrade, rpm, rug, sun,
sunfreeware, up2date, urpmi, windows, yum, zypper
            ensure:installed, present, latest, absent(移除), 或直接指明安装的版本号

name:包名;
source:程序包来源,仅对不会自动下载相关程序包的provider有用,例如rpm或dpkg;
provider: 指明底层的实现工具 ,即指明安装软件的程序
package {‘redis’:
ensure => present,
}
package {‘jdk’:
ensure => present,
source => ‘/root/jdk-8u144-linux-x64.rpm’,
provider => rpm,

}
group 管理用户组
name:组名;为默认值,即tatile 的值为此项的值
gid:GID;
system:是否为系统组,true OR false;
ensure:目标状态,present/absent;
members:以此组为附加组的用户
group {‘mygroup’:
ensure => present,
provider => groupadd,
}
~
puppet apply –noop -d -v groupadd.pp
user 管理用户
name:用户名;
uid: UID;
gid:基本组ID;
groups:附加组,不能包含基本组;
comment:注释;
expiry:过期时间 ;
home:家目录;
shell:默认shell类型;
system:是否为系统用户 ;
ensure:present/absent;
password:加密后的密码串;
managehome : 是否管理用户的家目录,即是否创建用户的家目录

Providers

aix, directoryservice, hpuxuseradd, ldap, pw, user_role_add, useradd,
windows_adsi
            user {'jinbus':
    ensure          =>      present,
    groups          =>      mygroup,
    shell           =>      '/bin/tcsh',
    comment         =>      'test user',
    system          =>      true,

}
service 管理服务

Providers

base, bsd, daemontools, debian, freebsd, gentoo, init, launchd, openbsd,
openrc, openwrt, redhat, runit, service, smf, src, systemd, upstart,
windows
            ensure:管理服务 `stopped` (also called `false`);`running` (also called `true`).

enable:是否开机启动 true, false, manual.
name:管理的服务名称
path:脚本的搜索路径,默认为/etc/init.d/ ,centos6 上的定义;
hasrestart: 是否支持重启restart
hasstatus: 是否支持status
start:手动定义启动命令;
stop: 手动定义停止命令
status:手动定义查看状态命令
restart:通常用于定义reload操作;
package {‘redis’:
ensure => present,
}

service {‘redis’:
ensure => running,
enable => true,
hasrestart => true,
require => Package[‘redis’]
}
~
file 管理文件
可以管理普通文件,目录,符号连接
ensure:
file:类型为普通文件,其内容由content属性生成或复制由source属性指向的文件路径来创建;
link:类型为符号链接文件,必须由target属性指明其链接的目标文件;
directory:类型为目录,可通过source指向的路径复制生成,recurse属性指明是否递归复制;
absent:不可存在
path:目标文件路径;默认参数
source:源文件;指定此参数时,表明复制源文件至,目标路径
跨主机: puppet:/// URL
content:文件内容;指定此参数时,表明创建文本文件,添加该段指定的内容
target:符号链接的目标文件;
owner:属主
group:属组
mode:权限;
atime/ctime/mtime:时间戳;
For Normal Files

source – Where to download contents for the file. Usually a puppet:/// URL.
content – The file’s desired contents, as a string. Most useful when paired with templates, but you can also use the output of the file function.

                For Directories

source – Where to download contents for the directory, when recurse => true.
recurse – 当复制的为目录时 ,此项指定为true 为递归复制.
purge –删除文件时,此项为true, 并且 recurse => true. 那么递归删除
For Symlinks

target – The symlink target. (Required when ensure => link.)
file {‘/etc/redis.conf’:
source => ‘/root/redis.conf’,
owner => ‘redis’,
group => ‘root’,
ensure => ‘file’,
}
file{‘test.txt’:
path => ‘/tmp/test.txt’,
content => ‘hi jinbus \n’,
ensure => file,
}
file {‘/tmp/test.link’:
ensure => link,
target => ‘/tmp/test.txt’,

}
file {‘/tmp/pam.d’:
source => ‘/etc/pam.d’
ensure => directory,
recurse => true,
}
exec 执行命令
首先保证执行的命令是幂等的.
command (namevar):要运行的命令;Name Var
cwd:The directory from which to run the command.
returns : 命令正确执行的退出码 ,默认为0
environment : 定义远程主机上的环境变量
user/group:运行命令的用户身份;
path:程序或命令在对方主机上存在的路径,存在多个路径时使用 : 分割
refresh:重新执行当前command的替代命令;
onlyif:此属性指定一个命令,此命令正常(退出码为0)运行时,当前command才会运行;
unless:此属性指定一个命令,此命令非正常(退出码为非0)运行时,当前command才会运行;
refreshonly:仅接收到订阅的资源的通知时方才运行;
creates:文件路径,仅此路径表示的文件不存在时,command方才执行;
exec {‘mktmp’:
command => ‘mktemp -d /tmp/dir.XXXX’,
path => ‘/bin:/sbin:/usr/bin:/usr/sbin’,

}
exec {‘mkdir’:
command => ‘mkdir /tmp/jinbubu’,
path => ‘/bin:/sbin:/usr/bin:/usr/sbin’,
unless => ‘test -d /tmp/jinbubu’,

create => ‘/tmp/jinbubu’,

}
cron 管理计划任务
command:要执行的任务;
ensure:任务的状态 present/absent;
name:cron job的名称;Name var
hour:
minute:
monthday:
month:
weekday:
user:以哪个用户的身份运行命令
target:添加为哪个用户的任务
创建
cron{‘timesync’:
command => ‘/usr/sbin/ntpdate 172.16.0.1 &> /dev/null’,
ensure => present,
minute => ‘*/3’,
user => ‘root’,
}
删除
cron{‘timesync’:
command => ‘/usr/sbin/ntpdate 172.16.0.1 &> /dev/null’,
ensure => absent,
minute => ‘*/3’,
user => ‘root’,
}
notify 将指定信息输出至日志中,在
单机运行时,直接输出至屏幕,而不会记录于日志.
message : 需要输出的信息
notify{‘aaa’:
message => ‘zhopuzhouwoainia’,
}
~
正则
(?:)
(?-:)
OPTIONS:
i:忽略字符大小写;
m:把.当换行符;
x:忽略中的空白字符
- 为 不启用选项 正常指明为启用选项
(?i-mx:PATTERN)
仅能用在接受=~或!~操作符的位置;
变量
$variable_name=value
变量定义
数据类型:
字符型:引号可有可无;但单引号为强引用,双引号为弱引用;
数值型:默认均识别为字符串,仅在数值上下文才以数值对待,即尽在进行数值计算时才为数值类型;
数组:[]中以逗号分隔元素列表;
布尔型值:true, false;
hash(字典):{}中以逗号分隔k/v数据列表; 键为字符型,值为任意puppet支持的类型;{ ‘mon’ => ‘Monday’, ‘tue’ => ‘Tuesday’, };
undef:未定义
变量的种类:

            facts:
由facts程序包生成,为puppet组件.为目标的系统信息变量.
facts -p  显示可用变量及对应值
                notify {'facter':
message => "$osfamily",

}
内建变量:
master端变量
servername, serverip, serverversionagent clientcert, clientversion, environment
parser变量
modulename pkg = ‘redis’
package {$pkg :
ensure => latest,
} ->

file { $pkg :
path => ‘/etc/redis.conf’,
source => ‘/root/redis.conf’,
ensure => file,
owner => ‘redis’,
group => ‘root’,
} ~>

service {$pkg :
ensure => true,
}
变量的作用域
scope 概念
用于限定变量生效范围,以及资源默认属性的作用范围

                任何给定的scope都可以访问它自己的内容,以及接收来自于其父scope、节点scope及top scope的内容

如图所示,top scope仅能访问自己变量和属性默认值;
节点scope能访问自己的及top scope的变量和属性默认值;
example::parent,example::other和example::four能访问自己的以及节点scope和top scope的变量和默认值
如果要访问非当前scope中的变量,则需要通过完全限制名称进行,如 vhostdir= apache::params::vhostdir
需要注意的是,top scope的名称为空,因此,如若要引用其变量,则需要使用类似“$::osfamily”的方式进行
使用数组定义依赖关系
package {‘redis’:
ensure => latest,
}

file {‘/root/redis.conf’:
path => ‘/etc/redis.conf’,
ensure => file,
owner => ‘redis’,
group => root,
require => Package[‘redis’],
}

service {‘redis’:
ensure => true,
require => [ Package[‘redis’], File[‘redis.conf’] ],
}

        定义变量
    操作符
        比较操作符
              == (equality)

!= (non-equality)
< (less than)

(greater than)
<= (less than or equal to)
= (greater than or equalto)
=~ (regex match)
!~ (regex non-match)
in
逻辑操作符
and
or
! (not)
数学运算操作符
+ (addition)
- (subtraction)
/ (division)
* (multiplication)
<< (left shift)

(right shift)
条件表达式
if 语句
单分支

            双分支

            多分支

            CONDITION的给定方式:
(1) 变量
(2) 比较表达式 
(3) 有返回值的函数
            if $osfamily == 'RedHat'{
    package{'httpd':
            ensure  => true ,
    }

} elsif $osfamily == ‘Debian’ {
package {‘apache2’:
ensure => true ,
}
}else {
notify {‘hehehehe’:
message => “heheheh”,
}
}

                引用整个正则表达式匹配的内容使用$0
            if $osfamily =~ /(?i-mx:RedHat)/{
    package{'httpd':
            ensure  => true ,
    }

} elsif osfamily==Debianpackageapache2:ensure=>true,elsenotifyhehehehe:message=>heheheh,if osfamily =~ /(?i-mx:debian)/ {
webserver = ‘apache2’  
} else {
webserver = ‘httpd’
}

package{“$webserver”:
ensure => installed,
before => [ File[‘httpd.conf’], Service[‘httpd’] ],
}

file{‘httpd.conf’:
path => ‘/etc/httpd/conf/httpd.conf’,
source => ‘/root/manifests/httpd.conf’,
ensure => file,
}

service{‘httpd’:
ensure => running,
enable => true,
restart => ‘systemctl restart httpd.service’,
subscribe => File[‘httpd.conf’],
}
case 语句
case CONTROL_EXPRESSION {
case1: { … }
case2: { … }
case3: { … }

default: { … }
}
CONTROL_EXPRESSION:
(1) 变量
(2) 表达式
(3) 有返回值的函数
各case的给定方式:
(1) 直接字串;
(2) 变量
(3) 有返回值的函数
(4) 正则表达式模式;
(5) default
case osfamily {  
    “RedHat”: {
webserver=’httpd’ }
/(?i-mx:debian)/: { webserver=’apache2’ }  
    default: {
webserver=’httpd’ }
}

package{“$webserver”:
ensure => installed,
before => [ File[‘httpd.conf’], Service[‘httpd’] ],
}

file{‘httpd.conf’:
path => ‘/etc/httpd/conf/httpd.conf’,
source => ‘/root/manifests/httpd.conf’,
ensure => file,
}

service{‘httpd’:
ensure => running,
enable => true,
restart => ‘systemctl restart httpd.service’,
subscribe => File[‘httpd.conf’],
}
case osfamily {  
        /(?i-mx:redhat)/ : {
webpkg = ‘httpd’}
‘Debian’ : { webpkg = ‘apache2’ }  
        default : {
webpak = ‘httpd’}
}

package{“webpkg”:  
        ensure  => latest,  
}  
~   
            selector 语句  
                CONTROL_VARIABLE ? {  
    case1 => value1,  
    case2 => value2,  
    …  
    default => valueN,  
}  
                CONTROL_VARIABLE的给定方法:  
    (1) 变量  
    (2) 有返回值的函数  
                各case的给定方式:  
    (1) 直接字串;  
    (2) 变量   
    (3) 有返回值的函数  
    (4) 正则表达式模式;  
    (5) default
pkgname = $operatingsystem ? {
/(?i-mx:(ubuntu|debian))/ => ‘apache2’,
/(?i-mx:(redhat|fedora|centos))/ => ‘httpd’,
default => ‘httpd’,
}

package{“pkgname”:  
    ensure  => installed,  
}
webpkg = $osfamily ? {
/(?i-mx:redhat)/ => ‘httpd’,
‘Debian’ => ‘apache2’,
default => ‘httpd’,
}

package{“webpkg”:  
        ensure  => latest,  
}
webserver = $osfamily ? {
“Redhat” => ‘httpd’,
/(?i-mx:debian)/ => ‘apache2’,
default => ‘httpd’,
}

package{“$webserver”:
ensure => installed,
before => [ File[‘httpd.conf’], Service[‘httpd’] ],
}

file{‘httpd.conf’:
path => ‘/etc/httpd/conf/httpd.conf’,
source => ‘/root/manifests/httpd.conf’,
ensure => file,
}

service{‘httpd’:
ensure => running,
enable => true,
restart => ‘systemctl restart httpd.service’,
subscribe => File[‘httpd.conf’],
}
用于实现变量条件式赋值

类:puppet中命名的代码模块,常用于定义一组通用目标的资源,可在puppet全局调用;
类可以被继承,也可以包含子类
即自建的type
语法格式:
class NAME {
…puppet code…
}

class NAME(parameter1, parameter2) {
    ...puppet code...
}
        类代码只有声明后才会执行,调用方式:
(1) include CLASS_NAME1, CLASS_NAME2, ...
(2) class{'CLASS_NAME':
        attribute => value,
     }
        类继承的方式:
class SUB_CLASS_NAME inherits PARENT_CLASS_NAME {
    ...puppet code...
}

即 : 子类名称 inherits 父类
在子类中为父类的资源新增属性或覆盖指定的属性的值:
Type[‘title’] {
attribute1 => value,

}
在子类中为父类的资源的某属性增加新值:
Type[‘title’] {
attribute1 +> value,

}
自定义类:
class memcached {
package {‘memcached’:
ensure => latest,
}
service {‘memcached’:
ensure => true,
}
}

include memcached
为变量指定默认值
class instpkg( pkgname=lrzsz)package$pkgname:ensure=>true,includeinstpkg,classinstpkg( pkgname=”lrzsz”) {
package{“pkgname”:  
                ensure => true,  
        }  
}  
class {‘instpkg’ :  
        pkgname => ‘haproxy’,  
}  
            实例  
                class apache2 {
webpkg = $operatingsystem ? {
/(?i-mx:(centos|redhat|fedora))/ => ‘httpd’,
/(?i-mx:(ubuntu|debian))/ => ‘apache2’,
default => ‘httpd’,
}

package{"$webpkg":
    ensure  => installed,
}

file{'/etc/httpd/conf/httpd.conf':
    ensure  => file,
    owner   => root,
    group   => root,
    source  => '/tmp/httpd.conf',
    require => Package["$webpkg"],
    notify  => Service['httpd'],
}

service{'httpd':
    ensure  => running,
    enable  => true,
}

}

include apache2
class dbserver(pkgname) {  
    package{“
pkgname”:
ensure => latest,
}

service{"$pkgname":
    ensure  => running,
    enable  => true,
}

}

include dbserver

if operatingsystem == “CentOS” {dbpkg = $operatingsystemmajrelease ? {
7 => ‘mariadb-server’,
default => ‘mysql-server’,
}
}

class{‘dbserver’:
pkgname => $dbpkg,
}
使用类继承
class nginx {
package{‘nginx’:
ensure => installed,
}

service{'nginx':
    ensure  => running,
    enable  => true,
    restart => '/usr/sbin/nginx -s reload',
}

}

class nginx::web inherits nginx {
Service[‘nginx’] {
subscribe => File[‘ngx-web.conf’],
}

file{'ngx-web.conf':
    path    => '/etc/nginx/conf.d/ngx-web.conf',
    ensure  => file,
    source  => '/root/manifests/ngx-web.conf',
}

}

class nginx::proxy inherits nginx {
Service[‘nginx’] {
subscribe => File[‘ngx-proxy.conf’],
}

file{'ngx-proxy.conf':
    path    => '/etc/nginx/conf.d/ngx-proxy.conf',
    ensure  => file,
    source  => '/root/manifests/ngx-proxy.conf',
}

}
class redis {
package{‘redis’:
ensure => latest,
} ->

    service{'redis':
            ensure  => running,
            enable  => true,
    }

}

class redis::master inherits redis {
file{‘/etc/redis.conf’:
ensure => file,
source => ‘/root/manifests/redis-master.conf’,
owner => redis,
group => root,
}

    Service['redis'] {
            subscribe => File['/etc/redis.conf'],
    }

}

class redis::slave inherits redis {
file{‘/etc/redis.conf’:
ensure => file,
source => ‘/root/manifests/redis-slave.conf’,
owner => redis,
group => root,
}

    Service['redis'] {
            subscribe => File['/etc/redis.conf'],
    }

}

                子主题 3




站点清单
    主机名称,建议定义规范
        主机名(主机角色)#-机架-机房-运营商-区域.域名
www1-rack1-yz-unicom-bj.magedu.com 
    清单定义
        定义路径

/etc/puppet/manifests/site.pp
定义语法
基本定义
node ‘base’ {
include ntp
}
node ‘HOSTNAME’ {
…puppet code…
}
基于正则的定义
node /PATTERN/ {
…puppet code…
}
如:
node /node[0-9]+.magedu.com/{
…puppet code…
}
node /jin[234].1024.com/{
include jin-httpd
include jin-lrzsz
}
节点定义的继承:
node NODE inherits PAR_NODE_DEF {
…puppet code…
}

nodes/
                如果这样怎么继承
                    node /jin[234]\.1024\.com/{
    include jin-httpd
    include jin-lrzsz

}
node ‘jin5.1024.com’ inherits ‘jin2.1024.com’ {
include redis
}
node ‘jin2.1024.com’{
include jin-httpd
include jin-lrzsz
}
node ‘jin5.1024.com’ inherits ‘jin2.1024.com’ {
include redis
}
清单配置信息可模块化组织:
databases.d/
tomcatservers.d/
nodes.d/:可通过多个pp文件分别定义各类站点的清单;而后统一导入site.pp,方法如下:

site.pp文件使用中如下配置:   
    import 'nodes/*.pp'
            子主题 6
        例 
            /etc/puppet/manifests/site.pp

node ‘jin2.1024.com’{
include jin-httpd
include jin-lrzsz
}
master/agent 部署
流程
master端启动服务
agent 启动服务,自动向server主机请求签署证书
master 端收到请求,手动进行签署
agent 收到签署证书,拉取配置,再次30分钟后再次更新配置
部署master:
安装程序包:facter, puppet, puppet-server
个主机之间配置hosts文件,实现互相解析主机名称
并且个节点时间需要一致,
生成一个完整的配置参数列表:
根据现有配置,生成完整的参数列表,输出至屏幕
puppet master –genconfig
puppet agent –genconfig
启动服务
自动启动服务: systemctl start puppetmaster.service
puppet master
启动服务,监听 8140 端口
puppet master [-D|–daemonize|–no-daemonize] [-d|–debug] [-h|–help]
[-l|–logdest |console|syslog] [-v|–verbose] [-V|–version]
[–compile ]
-D : 以守护进程方式运行
–no-daemonize
不以守护进程方式运行
签署证书
puppet ca list 列出待签署的证书
puppet cert sign 请求证书节点主机名称
-a 所有
部署agent
安装程序包
启动服务
自动启动: systemctl start puppetagent.service
puppet agent
puppet agent [–certname ] [-D|–daemonize|–no-daemonize]
[-d|–debug] [–detailed-exitcodes] [–digest ] [–disable [message]] [–enable]
[–fingerprint] [-h|–help] [-l|–logdest syslog||console]
[–no-client] [–noop] [-o|–onetime] [-t|–test]
[-v|–verbose] [-V|–version] [-w|–waitforcert
–server 指定连接的服务器,可直接设置在配置文件中
即: puppet config set server jin1.1024.com 更改后直接保存至配置文件
puppet agent –server jin1.1024.com –no-daemonize -d -v –noop
多环境部署
多环境部署时,agent 需声明所属的环境
默认不知明时,所属环境为 production
[root@192 manifests]# puppet config print |grep environ
environment = production
environmentpath =
environment_timeout = 180
多环境 master端部署
3.4之前的配置
puppet 3.4 之前的版本配置多环境的方法:

各环境配置:
/etc/puppet/environments/{production,development,testing}

master支持多环境:puppet.conf
[master]
# modulepath=
# manifest=
environments = production, development, testing

[production]
modulepath=/etc/puppet/environments/production/modules/
manifest=/etc/puppet/environments/production/manifests/site.pp

[development]
modulepath=/etc/puppet/environments/development/modules/
manifest=/etc/puppet/environments/development/manifests/site.pp 

[testing]
modulepath=/etc/puppet/environments/testing/modules/
manifest=/etc/puppet/environments/testing/manifests/site.pp 
            3.6之后的配置
                puppet 3.6之后的版本配置多环境的方法:

master支持多环境:
(1) 配置文件puppet.conf
[master]
environmentpath = confdir/environmentspuppetconfigsetenvironmentpath confdir/environments’ –section=master

(2) 在多环境配置目录下为每个环境准备一个子目录
ENVIRONMENT_NAME/
    manifests/  存放站点清单
        site.pp
    modules/    存放对应的资源清单
        多环境 agent 端部署

即只需要更改配置,使获取配置时发送指定的环境
agent端:
[agent]
environment = { production|development | testing }
直接在命令行指出所属的环境
通过命令行设定
推送 kick
文件系统:fileserver.conf
认证(URL):auth.conf
# path /path/to/resource # 对指定的URL开启认证

# path ~ regex # alternately, regex match

[environment envlist]

[method methodlist] 主机可以使用的方法 find为获取,save 保存

[auth[enthicated] {yes|no|on|off|any}]

allow [host|backreference|*|regex] 基于主机名称的白名单

deny [host|backreference|*|regex] 基于主机名称的黑名单

allow_ip [ip|cidr|ip_wildcard|*] 基于ip地址的白名单

deny_ip [ip|cidr|ip_wildcard|*] 基于ip地址的黑名单

            # path ~ ^/path/to/resource    # Equivalent to `path /path/to/resource`.

allow * # Allow all authenticated nodes (since auth

指定地址可以所有主机访问
# path ~ ^/catalog/([^/]+)$ # Permit nodes to access their own catalog (by

allow $1 # certname), but not any other node’s catalog.

仅允许对应主机访问对应自身的URL
开启推送功能后 agent 需要监听套接字,接受master发送的消息
agent配置
配置auth.conf文件,添加如下内容
path /run
method save
auth any
allow master.magedu.com

        path /
        auth any
            配置puppet.conf文件,添加如下内容
        [agent]
        listen = true
证书
模板
    puppet使用了 erp(embedded ruby) 语言 
    官方文档:

https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html
文本文件中内嵌变量替换机制:
<%= @VARIABLE_NAME %>
调用:
file{‘title’:
ensure => file,
path =>
content => template(‘/PATH/TO/ERB_FILE’),
}
使用內建的函数 解析文件
使用 content 创建文件并写入
示例:

模块
    模块就是一个按约定的、预定义的层级结构存放了多个文件或子目录的目录,目录里的这些文件或子目录必须遵循一定格式的命名规范;

puppet会在配置的路径下查找所需要的模块;
类似于 ansible的模块
管理 模块的命令
模块目录
/etc/puppet/modules
puppet module
获取帮助: puppet help module
格式 :puppet module [–environment production ]
puppet module search 模块关键词
查找模块
puppet module install 模块名称
安装模块
puppet module list
列出已有模块
模块目录结构
redis/
├── checksums.json
├── LICENSE
├── manifests 资源清单目录
│ ├── init.pp
│ ├── params.pp
│ └── spec.pp
├── files 直接文件测存放位置
├── metadata.json 版本信息,此文件需要执行权限
├── Rakefile
├── README.md
├── spec
│ ├── classes
│ │ └── redis_spec.rb
│ └── spec_helper.rb
└── templates 模板文件
└── spec.erb
manifests/
init.pp:必须一个类定义,类名称必须与模块名称相同;
files/:静态文件;
puppet URL:
puppet:///modules/MODULE_NAME/FILE_NAME
templates/:
tempate(‘MOD_NAME/TEMPLATE_FILE_NAME’)
lib/:插件目录,常用于存储自定义的facts以及自定义类型;
spec/:类似于tests目录,存储lib/目录下插件的使用帮助和范例;
tests/:当前模块的使用帮助或使用范例文件;
1、puppet 3.8及以后的版本中,资源清单文件的文件名要与文件子类名保持一致,例如某子类名为“base_class::child_class”,其文件名应该为child_class.pp;
2、无需在资源清单文件中使用import语句;
3、manifests目录下可存在多个清单文件,每个清单文件包含一个类,其文件名同类名;
创建模块
mkdir -pv /etc/puppet/modules/jdk/{manifests,files,tempplates,spec,tests,lib}
实例:
创建简单模块
manifests/init.pp
class jdk (version = ‘1.8.0’){  
        package {‘jdk’:  
                name    => “java-
version-openjdk”,
ensure => latest,
}
}
manifests/devel.pp
class jdk::devel inherits jdk {
package {“jdk-devel”:
ensure => latest,
name => “java-$version-openjdk-devel”
}
}
puppet apply –noop -v -e “include jdk”
puppet apply –noop -v -e “include jdk::devel”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值