一、基本概念

  • 资源:是Puppet最基础的元素。资源可以是文件、服务、软件包、自定义脚本等。Puppet主要的特色就是处理资源与资源之间的依赖与关系

  • 属性:资源需要定义的相关属性值,通过属性的定义才知道资源在做什么

  • 类:将多个资源组织起来进行重新定义。

  • 模块:多个类的集合。

  • 变量:与其他语言类似,同样支持变量。

  • 参数:通常把传递给变量的值称为参数

  • 节点:Puppet的每一个客户端,即主机。Puppet在管理主机时要求与计算机配置的主机名保持一致,并建议采用DNS来管理主机名。

 

二、语法与命令

1、语法基础

Puppet语法规则是以括号{}分类,以冒号 : 声明,以逗号 , 属性结束

例: file {‘nginx’:

ensure=> file,

}

注释

  • #这是一个注释

  • /*这是一个注释*/

  • //这是一个注释,不建议使用这种

变量的引用

  • 不包含变量的字符串应该使用单引号(’’)括起来。

  • 包含变量的字符串应该使用双引号(””)括起来,字符串中的所有变量应该使用花括号{}括起来

例:“${::operatingsystem}is not supported by ${module_name}”

  • 对变量本身的引用最好不用花括号

例:mode => $my_mode

资源

(1)资源名

资源名采用单引号(’’)引起来,采用冒号:结尾。如果有变量的时候就用双引号引起来。

例:package { ‘nginx’:

ensure=> present

}

(2)对齐

资源名称和各个符号之间都有一个空格

(3)属性的顺序

当声明一个资源时,应该先指定它的ensure属性,方便阅读

(4)文件权限

设置一个文件的权限时,需要将权限用单引号引起来

例:

file {‘/var/log/syslog’:

ensure=> present,

mode=> ‘0644’,

}

(5)资源默认值

通常需要设置一些资源默认值,为一组资源指定一个默认的参数值,减少重复定义。资源默认值类似于全局变量。设置资源默认值时应将资源类型的第一个字母大写。最常见的用法是使用exec资源指定path变量目录,避免在以后使用命令时找不到操作系统的环境变量

例:

vim /etc/puppet/manifests/site.pp

Exec { PATH => “/usr/bin:/usr/sbin:/usr/local/bin”}

定义一个文件资源的用户默认值

vim /etc/puppet/manifests/site.pp

file {

mode=> ‘0644’,

owner=> ‘root’,

group=> ‘root’,

}

(1)文件名的命名方式

在一个模块中,如果定义了一个类,且它还有子类,那么它的文件命名方式就是”子类名.pp“。比如定义一个apache的类,包含ssl与virtual_host两个类。那么在manifests目录同时有3个文件:init.pp、ssl.pp、virtual_host.pp。配置方法如下:

# /etc/puppet/modules/apache/manifests

#init.pp

class apache {}

#ssl.pp

class apache::ssl {}

#virtual_host.pp

define apache::virtual_host () {}

(2)关系声明

声明两个资源之间的关系时,必须是从左到右的顺序进行,不能从右到左

例: Package[‘httpd’]-> Service[‘httpd’]

(3)类的继承

表达方式如下:

class ssh {}

class ssh::client inherits ssh {...}#client 子类继承ssh类

class ssh::server inherits ssh {...}#server子类继承ssh类

2.语法检查

puppet parservalidate init.pp #对init.pp做语法检查

一次检查多个文件

方法一:

$ for file in $(find . -iname ‘*.pp’); dopuppet parser validate --color false --render-ass --modulepath=modules $file ;done;

#通过find命令查找当前目录下pp结尾的文件,然后采用for循环执行puppet检查文件语法

方法二:

$ find -name ‘*.pp’ | xargs -n 1 -t puppetparser validate

#通过find命令查找当前目录下以pp结尾的文件,通过管道传给xargs命令

#-n 参数指定一次只处理一个变量,-t参数启用跟踪方式执行puppet检查文件语法

代码的调试

方法一:

用logoutput输出更详细的信息

例:

$ vim test_output.pp

exec { ‘test_logoutput’:

command=> “/bin/ls linuxtone.org”,

logoutput=> on_failure,

}

如果你想不管命令执行成功或者失败都输出错误信息,可以这样做:

logoutput => true,

方法二:

用notify输出需要的信息,与执行一条echo语句的意义类似

例:

notify { “i am running on node $fqdn” }

3、常用命令

Puppet中所有命令都可以使用puppet help 命令查看。

$puppet help

agent                      #客户端进程,负责从Master获取数据

apply                      #运行本地manifests

ca                        #本地证书的管理

catalog                     #编译、保存、查看Puppet代码,或转换成Catalogs

cert                       #证书颁发,用于签署

certificate                  #提供访问CA证书的管理

certificate_request          #管理证书请求

certificate_revocation_list      #管理撤销证书的列表

config                      #配置选项

describe                    #资源帮助

device                      #管理远程网络设备

doc                        #生成puppet文档

facts                       #系统信息检索

file                        #在filebucket中检索和存储文件

filebucket                    #在filebucket中检索和存储文件

help                       #查看帮助

inspect                     #发送report报告

instrumentation_date            #管理监听的数据

instrumentation_listener          #管理监听状态

instrumentation_probe            #管理监听探测

key                        #创建、保存、删除证书密钥

kick                       #远程控制agent,远程触发puppet agent命令

man                        #查看手册

master                      #服务端进程

modules                     #从puppet forge创建、安装查询模块

node                       #管理节点

parser                     #解析器管理

plugin                     #插件管理

queue                      #队列进程

report                     #创建查看报告

resource                    #查看资源帮助

resource_type                 #查看类、默认资源类型与节点信息

secret_agent                 #模拟agent

status                     #查看puppet状态

其中常用命令有:

puppet master

puppet master 的主要功能是编译配置文件、模板

常用参数:

  • --daemonize 简写-D

  • --no-daemonize

  • --debug 简写-d

  • --version 简写-V

  • --verbose简写-v

例:

输出默认配置文件

puppet master --genconfig>puppet.conf

不启用后台守护进程方式运行,把信息显示出来

puppet master --no-daemonize --verbose

puppet agent

puppet agent在每个节点以守护进程方式运行,每隔30分钟向master请求一次,以确定新的信息并询问是否有变更,然后负责运行编译好的catalog。

常用参数:

  • --certname                #指定客户端证书名称

  • --daemonize

  • --no-daemonize

  • --debug

  • --noop                   #模拟执行

  • --test                   #测试

  • --verbose

    例:

测试连接master并模拟运行

puppet agent --test --noop --verbose

puppet apply

运行命令,主要在检测manifests时或在没有网络的情况下使用

常用常数:

  • --debug

  • --noop

  • --verbose

  • --loadclasses

例:

将输出信息输出到日志文件

puppet apply -l /tmp/init.log init.pp

在客户端运行命令,加载服务器端定义好的一个类

puppet apply -e “include test” --noop

puppet cert

用于管理本地证书、查看、签署证书、废除、清除证书

常用操作:

  • clean                  #清除证书

  • list                    #查看认证客户列表

  • sign                    #签署证书

  • revoke                   #废除已认证的主机

  • verify                   #验证本地指定的认证

常用参数:

  • --all                    #执行所有操作

  • --digest                  #设置证书指纹加密方式

  • --debug

  • --verbose

例:

查看请求认证的客户端列表

puppet cert list

为主机dx.a1.com签署认证

puppet cert sign dx.a1.com

列出所有签名和为签名的证书

puppet cert list --all

清除所有证书

puppet cert clean

puppet kick

用于连接到agent客户端让它主动运行puppet agent --test命令,类似于主动触发配置。最常见的用法是指定一个类主机或一组主机。或指定匹配主机只运行带”tag”标志的类。

要使用puppet kick需要做如下配置:

(1)设置puppet agent所有节点的/etc/puppet/puppet.conf在[agent]字段增加 listen=true

(2)设置puppet agent所有节点的防火墙开发8139端口

(3)设置puppet agent所有节点/etc/puppet/auth.conf  path /之前增加

path /run

method save

auth any

allow puppet-master.domain.com

常用参数:

  • --all

  • --class                        #指定类

  • --debug

  • --host                         #指定主机

  • --parallel                      #并发连接,提高效率,但会导致master压力增大

  • --tag                        #指定标签

例:

指定主机执行kick操作

puppet kick -p 10 host1 host2

puppet describe

提供资源的类型等帮助信息

常用参数:

  • --help

  • --providers                     #列出类型详细说明

  • --list                        #列出所有类型

例:

查看所有的资源类型

puppet describe --list

列出资源的providers

puppet describe file --providers

三、资源

资源是puppet最基础的元素,每个资源的定义都具有标题、类型以及一系列的属性。puppet的特色就是处理资源之间的依赖关系。

资源定义有如下特性:

l  puppet使用title在编译时区分每个资源,使用命令变量在执行是区分资源

l  在同一类型的资源中title和namevar都是唯一的

l  每个类型都有部分属性有默认值

l  如果不指定namevar,则默认赋予其title的值

资源清单manifests

puppet系统中有两个地方会出现manifests

/etc/puppet/manifests主要用于管理主机(节点)信息,其中会存放puppet主配置文件site.pp,用于定义全局变量及主机的加载。而在定义模板时会在模块目录中创建manifests目录,即/etc/puppet/modules/modules_name/manifests,这里的manifests是用来管理模块的代码文件,其中init.pp是主文件,其余.pp文件可以使用require或include加载。

资源之间的依赖关系

require

引用一个或多个依赖的对象,引用的对象执行之后该资源才被应用

before

与require相反,本资源执行成功后,before引用的对象才被应用

before和require不具备触发功能,只表示依赖关系。

subscribe

类似require,引用一个或多个依赖的对象,当引用的对象资源发生改变时,执行相应动作,相当于监测某个资源

notify

类似before,引用一个或多个依赖的对象,当该资源对象发生改变时,通知某个资源进行更新

通常在相关的依赖资源配置中,只需配置一个,例如file文件资源发生改变时利用notify属性通知service资源重启服务。或service资源利用subscribe属性探测到file文件资源进行更新时重启服务。

例:

指定某个资源依赖于某个类

require => Class[‘repo163’]

指定某个资源依赖于软件包及某个类

require => [ Package[‘test’],Class[‘testclass’]

注意:

在编写资源清单时有两处要用到首字母大写

(1)定义资源的默认值

例:

在site.pp配置文件中使用exec资源定义全局path变量

Exec { path =>“usr/local/sbin:/xxxxxx..” }

(2)资源之间的依赖关系

在利用before、notify、require、subscribe等参数定义资源之间的依赖时,被依赖的资源名称应该使用首字母大写

例: require =>Package{‘aaa’}

常用资源:

(1)用户资源user

用户资源user即管理系统用户。常用参数:

  • ensure:指定用户是否存在,创建用户使用present,删除用户使用absent

  • expiry:过期时间

  • gid:用户组ID

  • groups:用户组

  • home:家目录

  • shell:指定shell

  • system:指定是否系统用户

  • uid:用户ID,不指定自动选择

  • passwd:密码

例:

创建用户dx并指定uid为555,shell为/bin/bash,家目录,过期时间

user {‘dx’:

ensure=> present,

uid=> 555,

shell=> ‘/bin/bash’,

home=> ‘/home/dx’,

expiry=> ‘2018-8-8’,

}

(2)用户组资源group

group即管理系统用户组。常用参数:

  • ensure:创建present,删除absent

  • name:组名

  • gid:组ID

  • groups:组名

  • members:组成员管理

  • system:指定是否创建系统组

例:

创建一个gid为15的dx组,组内有两位用户成员aa和bb

groups { ‘dx’:

ensure=> present,

name=> ‘dx’,

members=> [ ‘aa’,’bb’],

}

(3)软件安装package

常用参数:

  • configfiles:是否保留或者替换软件的配置文件,大多数软件不支持这个参数,可设置false和true

  • ensure:设置软件包状态。installed表示要安装该软件,也可以学成present,obsent卸载,pureged干净的移除该软件,latest表示安装软件包的最新版本。

  • name:该资源的名字,即软件包的名字

  • install_options:以数组形式附加到安装选项,通常使用INSTALLDIR来指定软件安装路径

例:

确保nginx已安装

package { ‘nginx’:

name=> ‘nginx’,

ensure=> present,

}

确保nginx软件包版本为仓库中的最新版本(指定yum源中的最新版本)

package { ‘nginx’:

ensure=> lastest,

}

指定软件的安装版本

package { ‘nginx’:

ensure=> ‘1.2.5’,

}

指定软件包管理器进行安装

package { ‘nginx’:

provider=> apt-get,

ensure=> present,

}

指定本地软件包安装

package { ‘rack’:

ensure=> present,

provider=> gem,

source=> ‘/home/rack.gem’,

}

指定远程软件包进行安装

package { ‘screen’:

ensure=> present,

provider=> rpm,

source=> http://$fileserver/screen.rpm,

}

安装多个软件包

package { [‘nginx’,’httpd’,’mysql-server’]:

ensure=> present,

}

(4)文件管理file

  • file可以管理文件、目录、符号连接、属性、权限等

  • 常用参数:

  • ensure:值可以为删除absent,文件file,目录directory,文件present(检查文件是否存在,如果存在则不创建)

  • backup:通过filebucket备份文件

  • checksum:检查文件是否被修改的方法,默认检查方法为md5

  • ctime:只读属性,文件的ctime

  • mtime:

  • content:文件的内容,与source和target属性互斥

  • force:强制执行删除文件、软连接及目录的操作。下列三种情况需要使用force属性:清空子目录、修改文件或软连接的目录、删除目录时确保ensure=absent

  • owner:用户名或用户ID

  • group:指定该文件的用户组,可以是组名或ID

  • ignore:忽略指定的匹配文件、可以匹配目录结构

  • link:软件连接

  • mode:文件权限配置,通常使用数字符号,例0644

  • path:文件路径,必须使用双引号,不定义title时path等于资源的title

  • purge:清空目录中未在puppet manifest中定义的文件或目录,必须与recurse=>true同时使用

  • recurse:递归目录,值为true、false、inf、remote

  • replace:判断当本地已存在的文件与source或content指定的文件内容不同时是否覆盖。如果设置为false,则允许文件资源初始化时忽略本地已存在的文件,即本地文件不发生变化。这个特性只对文件内容有影响。默认值为true

  • source:源文件,从哪下载文件至本地,或者从本地读取

  • target:指定目标,符号链接专用

  • type:只读状态检查文件类型

例:

创建一个文件

file {‘/tmp/aa.txt’:

ensure=> file,

}

指定资源title为test,利用path属性指定文件路径

file { ‘test’:

path=> ‘/tmp/test’,

ensure=> present,

}

以上代码为简写方式,在使用require等参数进行资源依赖的时候可以直接指定资源的title,不用写太长的path内容,如

require => File[‘tmp/test’],

创建一个目录

file { ‘/tmp/aa’:

ensure=> directory,

}

创建一个符号链接

file {‘/tmp/testlink’:

ensure=> ’link’,

target=> ‘/tmp/testlink’,

}

将服务器文件同步至本地

file { ‘test’:

name=> ‘/tmp/test’,

ensure=> present,

source=> ‘puppet:///modules/test/test’

}

注意!这里的‘puppet:///modules/test/test’,文件是存放在/etc/puppet/modules/test/files/test中的。source属性定义时使用的”///”是省略了本地puppetmaster的servername,在没有定义fileserver的情况下,puppet默认会去master模块本地的files文件目录查找

(5)服务管理service

常用参数:

  • enable:用于开机自动启动,可以设置值为true或false

  • ensure:服务的状态,停止false,运行true

  • hasrestart:指出管理脚本是否支持restart参数,如果不支持,就使用stop/start实现restart的效果,可以设置值为true或false

  • hasstatus:指出管理脚本是否支持status参数,可以设置值为true或false

  • name:运行服务的名称

  • path:指定查找init脚本的路径

  • restart:可以指定重启命令

  • start:指定启动命令

  • status:指定状态命令

  • stop:指定停止命令

例:

开启nginx服务,不随系统启动

service { ‘nginx’:

ensure=> ‘running’,

enable=> false,

}

指定命令路径,确保服务运行并随系统启动而启动

service { ‘nginx’:

enable=> true,

ensure=> running,

path=> “/etc/init.d”,

}

通过指定restart属性来指定服务重启命令

service { ‘nginx’:

ensure=> running,

enable=> true,

hasrestart=> true,

hasstatus=> true,

subscribe=> File[ ‘nginx.conf’],

restart=> “/etc/init.d/nginx reload “,

}

puppet在接收到事件通知并重启服务时,如果提供了一个明确的restart属性重启服务,puppet每次会先判断restart属性是否有值,如果有就执行restart值。如果没有,会再次根据hasrestart属性的定义判断脚本是否支持restart,如果不支持此参数,会以stop/start来实现restart效果。

因此,restart与hasrestart这两个属性可以不同时进行定义

(6)定时脚本cron

定时脚本用于安装和管理系统cron作业。puppet会将任务写入/var/spool/cron目录与用户对于的文件中,/etc/crontab中原有的任务不会变。如果puppet指定的任务与现有的一致,puppet不会对它做任何修改。

常用参数:

  • ensure:可配置为present或absent

  • command:需要执行的命令,通常使用双引号引起来

  • environment:运行的环境变量配置,例如PATH=/bin

  • hour:小时。0-23

  • minute:分钟。0-59

  • month:月。1-12

  • monthday:月中的天,1-31

  • weekday:星期几,0-7

  • name:名称

  • user:指定运行的用户,默认为root

  • target:指定用户的cron项,默认为用户的shell

例:

每天早上6点执行一次ntpdate

cron { ‘ntpdate’:

ensure=> present,

command=> “/usr/sbin/ntpdate ntpserver.domain.com”,

user=> root,

hour=> 6,

minute=> 0,

}

(7)执行命令exec

puppetlabs建议少用exec资源。常用参数:

  • command:执行的命令。命令必须包含绝对路径或在path中定义了搜索路径

  • creates:指定命令生成的文件。如果提供了这个参数,那么命令只会在所指定的文件不存在的情况下被执行。

  • cwd:指定命令执行的当前目录

  • environment:为命令设置额外的环境变量

  • group:运行命令的用户组

  • user:执行命令的用户

  • logoutput:是否记录输出,默认为on_failure,可以定义为true或false

  • onlyif:参数中设置的命令返回0时才执行,即成功时才执行

  • path:执行命令的搜索路径

  • refreshonly:该参数可以使命令变成仅刷新触发的,也就是说只有在一个依赖的对象被改变时,命令才会被执行。仅当命令与其他对象有依赖关系时,这个参数才有意义。当要触发某个行为时,这个参数会显得很有用。

  • timeout:命令执行超时时间,默认300秒

例:

解压nginx.tar.gz至/tmp目录,如果“/tmp/myfile”文件不存在,则执行exec命令。如果文件存在则不执行

exec { ‘tar -xvzf /tmp/nginx.tar.gz’:

cwd=> ‘/tmp’,

creates=> ‘/tmp/myfile’,

path=> [ ‘/usr/bin’,’/usr/sbin’,’/bin’],

}

当文件被更新时触发该资源被执行

#从服务端下载aliases文件

file { ‘/etc/aliases’:

source=> ‘puppet://server/module/aliases’,

}

exec { ‘newaliases’:

path=> [‘/usr/bin’,’/usr/sbin’],

subscribe=> File[“/etc/aliases”]

refreshonly=> true,

}

以上代码,只有当文件/etc/aliases再次被更新时才触发newaliases动作。所有refreshonly需要配置subscribe和notify才有意义

四、模块

模块是多个类的集合。

模块的结构:

#/etc/puppet/modules/test模块

模块的目录及命名通常以应用软件来命名,好处是可以一目了然的知道此模块的功能。每个模块都包含files(文件)、lib(插件)、manifests(资源)、templates(模板)四个目录和init.pp文件。当加载一个模块,会先加载manifests下的init.pp文件。

详细说明:

l  MODULE NAME:模块名称,也即模块目录名称;模块名称只能以小写字母开头,可以包含小写字母、数字和下划线,但不能使用“main”或“settings”作为模块名;

l  manifests目录:包含当前模块的所有manifest文件;每个manifest文件必包含一个类或一个定义的类型,此文件访问路径格式为“ModuleName::[SubDirectoryName::]ManifestFileName”,注意manifiest文件名不需要其后缀.pp;

l  init.pp:只能包含一个单独的类定义,且类的名称必须与模块名称相同;

l  files目录:包含了一组静态文件,这些文件可被节点下载使用;每个文件的访问路径遵循puppet:///modules/MODULE_NAME/filename路径格式;

l  lib目录:插件目录,常用于自定义fact及自定义资源类型等;

l  templates目录:存储了manifest用到的模板文件,其访问路径遵循template('ModuleName/TemplateName')格式;

l  tests目录:当前模块的使用帮助或使用范例文件,类似如何声明当前模块中的类及定义的类型等,不是必须;

l  spec目录:类似于tests目录的功能,只不过,其是为lib目录中定义的各插件提供使用范例的,不是必须;

模块的默认目录为/etc/puppet/modules,运行命令puppet apply --configprint modulepath可以查看。

“puppet module list”可列出当前puppet上已经安装的所有模块。如果要安装模块,可使用“puppetmodule install <Module Name>”命令。

以上图结构为例:创建一个nginx模块

(1)创建所需的目录

#mkdir -pv /etc/puppet/modules/test/{manifests,templates,files,lib}

只创建manifests,templates,files三个目录也可以

(2)创建init.pp

#vim/etc/puppet/modules/test/manifests/init.pp

class nginx {

package{ ‘nginx’:

ensure=> present,

}

service{ ‘nginx’:

ensure=> running,

enable=> true,

subscribe=> File[‘nginx.conf’],

}

file{ ‘nginx.conf’:

ensure=> present,

mode=> 644,

path=> ‘/etc/nginx/nginx.conf’,

content=> template(“nginx/nginx.conf.erb”),

}

(3)创建模板

可以把nginx.conf拷过来做修改即可,下面只截取部分做示例

#user nobody;

worker_processes  <%= processorcount %>;

#error_log logs/error.log;

#error_log logs/error.log  notice;

#error_log logs/error.log  info;

#pid       logs/nginx.pid;

events {

worker_connections  1024;

}

...

示例说明:

nginx模块定义了一个nginx类,类中包含资源package、file、service,其中service依赖于file,nginx.conf文件内容采用content定义来源于template中对应的nginx.conf.erb模板内容

 

五、类

Class是用于通用目标或目的的一组资源,因此,它是命名的代码块,在某位置创建之后可在puppet全局使用。类似于其它编程语言中的类的功能,puppet的类可以继承,也可以包含子类。类的名称只能以小写字母开头,可以包含小写字母、数字和下划线。

(1)类的定义

class class_name { ... }

在同一个模块中定义了多个类,可以采用双冒号:: 例:

class nginx { ... }

class nginx::config { ... }

class nginx::vhost { ... }

config、vhost为nginx的子类

(2)类的继承

类的继承主要是一个类继承另一个类,且可以实现覆盖、追加资源属性

下面以这个nginx模块代码为例来介绍类的继承

定义nginx为父类,nginx::foo为子类。父类代码如下:

class nginx {

service{ ‘nginx’:

ensure=> running,

enable=> true,

require=> File[‘nginx.conf’]

}

}

例:

继承(对原有参数不做修改原样写上)、覆盖资源属性

nginx::foo inherits nginx {

service[‘nginx’]{ ensure=> running,enable => false }

}

追加资源属性

nginx::foo inherits nginx {

service{ ‘nginx’:

require+> [ File[‘nginx.conf’],File[‘foo.conf’] ],

}

}

(3)带参数的类

同一个类在不同的OS上可能会略有不同,因此需要通过获取相应系统的fact来实现有区别对待。然而,万一相应的OS没有输出类所期望的fact或者是类依赖于非fact因素时,此机制将无法满足需求。此实就需要使用带参数的类来完成此类功能,同时,在声明类时为其参数传递相应的值即可完成传参功能。

在定义在带参数的类时,需要将参数声明在类名后的小括号“()”,参数可以有默认值;如果使用多个参数,彼此间要使用逗号分隔。在类的内部使用参数的方式同使用本地变量。下面的示例定义了一个具有两个参数的类:

class mysql ($user = 'mysql', $port = 3306) {

...

}

向类传递参数时,即调用时,其方式如同定义资源的属性,因此,其也称为“资源属性风格的类声明”,其语法格式如下

class {'class_name':

para1 => value1,

para2 => value2,

...

}

例如,向上述的mysql类的$user参数传递一个与默认mysql不同的值的方式如下所示。

class {'mysql':

user => mysqlserver,

}

如果使用mysql类默认值的话,直接用include mysql 就好了

注意,不能在使用include声明类时向其传递参数,也就是说不能在include函数中为声明的类指定参数值。对于带参数的类来说,如果使用其参数的默认值,仍然可以使用include声明类,否则就必须使用“资源属性风格的类声明”。另外,如果在使用不同的参数值将某个类声明了多次,最后生效的声明将很难判定。

六、模板

模板的定义与声明

puppet模板主要是基于ERB模板语言的。在模板中可以使用的变量是调用次模板的当前类中的所有变量,包含facts、全局变量、在类中定义的当前作用域变量。

(1)标签

除打上标签的内容外,ERB模板中的内容会原封不动的传送回puppet。ERB标签如下,可包含一行或多行:

<% document = “” %>

(2)打印、输出表达式

要打印或输出一个表达式,这样写,经常会用到这个输出获取到的facter信息

<%= aaa %>

(3)注释

注释不会被解析为代码也不会显示输出

<%# ... %>

模板结合

如果有多个模板时,可以使用逗号进行结合,例:

template(‘my_module/template1.erb’,’my_module/template2.erb’)

模板还支持数组、条件表达式,用到的时候再做详细了解吧

七、节点

puppet每个客户端都称为节点。所有的节点都需要在站点文件中进行定义,采用import的方式进行引用。一般都会以主机名来命名节点配置文件,做到一目了然。

例:

nodes目录下存在多个节点配置文件,可以在site.pp中import所有节点文件

#vim /etc/puppet/manifests/site.pp

import “nodes/*.pp”

节点配置文件分类存放

#vim /etc/puppet/manifests/site.pp

import “nodes/cnc/*.pp”

import “nodes/ctc/*.pp”

主机命名规范

建议遵循以下规范:

role-isp-idc-ip.centos.domain.com

#角色名-运营商-机房名-机器IP.管理域名.com

例:

web-cnc-bj-174.129.158.192.centos.linuxtone.org

节点继承

如果某个上线的服务存在相同的网络环境,所有服务器都需要应用同一配置并定义同一变量,类似于系统环境的初始化,可以采用定义一个basenode默认节点的方法进行配置,其他主机节点采用 inherits 继承basenode的配置信息,如:

node basenode {

$my_puppet_server= “10.42.0.10”

$my_local_network= “10.42.0.0/24”

$my_syslog_server= “10.42.0.11”

$my_ntp_server= “10.42.0.12”

}

node ‘www.domain.com’ inherits basenode {

includegeneral

includehttpd::php

}

以上代码www.domain.com继承basenode默认节点的属性,4个变量直接应用到该节点内,同时还包含了general和httpd::php两个类

如果有需要,继承的时候可以覆盖其中的变量

node ‘ntp.domain.com’ inherits basenode {

$my_ntp_server= “0.pool.ntp.org”

}

默认类与默认节点

定义默认类与默认节点的目的相同,这样定义默认类:

class general {

includeyum

includehosts

...

}

默认节点的定义,除了定义basenode,我们还可以定义一个default,如果没有明确定义一个节点,将按default进行操作。default的定义存在puppet每次都会编译catalog的问题,也就是说不管所定义的default有没有在用,都回忆将它编译到catalog,如果没有使用的情况下,将会导致性能下降,如果没有特殊需求,建议采用basenode或baseclass(general)的方法实现。default定义如下:

node default {

$my_local_network= “10.42.0.0/24”

}

 

八、Facter

facter最大作用就是获取服务器信息,这些信息包括主机名、IP地址、内存大小、操作系统等。

使用方法:

#facter

#facter fqdn

即可输出当前主机的所有信息或其中一个信息

结合条件语句的使用:

if $operatingsystem == debian {

package{ ‘apache’:

ensure=> latest,

}

}

else {

package{ ‘apache’:

name=> ‘http’,

ensure=> latest,

}

}

使用case条件判断

case $operatingsystem {

debian:{ $apache = “apache” }

centos:{ $apache = “httpd” }

default:{ fail(“unrecognized operating system for webserver”) }

}

package { ‘apache’:

ensure=> latest,

}

 

九、标签

tag用于为资源指定标签

例:

file { ‘/etc/nginx/nginx.conf’:

ensure=> present,

tag=> ‘ngx-conf-file’,

}

指定标签运行特定配置,例:

客户端使用

puppet agent --tags centos

服务器端使用

puppet kick -p 10 -t centos dx.domain.com

在节点配置中指定

通常会配合notify使用,如:

tag(“nginx”)

if tagged(“nginx”) {

notify{ “this will succed”: }

}

用法还有很多,用到再详细了解吧

转载于:https://blog.51cto.com/dengxi/1755447

Puppet之基础篇相关推荐

  1. Puppet基础篇9-Puppetmaster多环境配置

    Puppet基础篇9-Puppetmaster多环境配置 零基础学习Puppet自动化配置管理系列文档 扩充现有架构环境是对一个企业成长的见证 将基础环境模块部署到puppetmaster端之后就可以 ...

  2. puppet基础篇(练习篇)

    puppet基础篇(练习篇) 本文分为两部分:一.安装配置及命令用法:二.puppet资源基础练习 1.安装配置及命令用法 #在epel仓库安装 yum install ./facter-2.4.6- ...

  3. Puppet基础篇7-编写第一个完整测试模块puppet

    Puppet基础篇7-编写第一个完整测试模块puppet 零基础学习Puppet自动化配置管理系列文档 将Puppet部署到生产中第一个要编写的模块就是puppet本身,虽然puppet可以运行其它所 ...

  4. Puppet基础篇5-如何建立master和agent之间的认证关系

    Puppet基础篇5-如何建立master和agent之间的认证关系 零基础学习Puppet自动化配置管理系列文档 Puppet注册方式基本上有三种:自动注册.手动注册和预签名注册,在<Pupp ...

  5. Puppet基础篇6-Puppet更新方式的选型

    Puppet基础篇6-Puppet更新方式的选型 零基础学习Puppet自动化配置管理系列文档 基于C/S架构的Puppet更新方式一般有两种,一种是Agent端设置同步时间主动去PuppetMast ...

  6. Ansible自动部署(基础篇)

    Ansible自动部署(基础篇) 一.ansible简介 1.ansible介 Ansible这个名字来源于科幻小说,是一种超光速通讯设备.在Linux中,ansible是新出现的自动化运维工具,基于 ...

  7. Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

    目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...

  8. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)

    目录 1. 水平布局类(QHBoxLayout) 2.垂直布局类(QVBoxLayout) 3.网格布局类(QGridLayout) 3.1.单一的网络布局 3.2.跨越行.列的网络布局 4.表单布局 ...

  9. Python Qt GUI设计:窗口布局管理方法【基础】(基础篇—5)

    目录 1.布局管理器进行布局 2.容器控件进行布局 3.geometry属性:控件绝对布局 4.sizePolicy属性:微调优化控件布局 Qt Designer提供4种窗口布局方式,分别如下: Ve ...

  10. ES6 你可能不知道的事 – 基础篇

    ES6 你可能不知道的事 – 基础篇 转载 作者:淘宝前端团队(FED)- 化辰 链接:taobaofed.org/blog/2016/07/22/es6-basics/ 序 ES6,或许应该叫 ES ...

最新文章

  1. Error: could not find function ... in R
  2. Linux下zkui的安装
  3. 第18节 知识管理
  4. 音乐社交APP源码ios版
  5. CVE-2019-0708复现
  6. linux 打开php服务器文件夹,Linux下如何查看文件和文件夹大小
  7. docker 容器内部获取自身id_crontab入门二:定时启动docker容器并启动容器内部脚本...
  8. 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)
  9. redis实现可重入锁
  10. js如何获取php中的变量的类型,js获取变量的类型
  11. php 755,chmod 命令——chmod 755与 chmod 4755区别_PHP教程
  12. matlab 空集判定,在使用matlab 符号运算中的solve函数时,为啥计算的结果是空集?该怎么办?...
  13. java 新浪短链接_如何通过Java调用新浪短网址官方API接口实现短网址缩短功能
  14. 怎么进行PDF合并?PDF合并方法
  15. 1000道最新高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构!
  16. RabbitMQ 基本消息模型和消息确认机制
  17. 3 FPGA时序约束理论篇之IO约束
  18. Markdown文件关机没保存,怎么恢复
  19. 另一只眼看软件研发效能提升,软件研发效能的“人性”与“物性”
  20. 多设备制造工厂的IIOT解决方案--基于虹科IO-Link Wireless

热门文章

  1. Layui 左部菜单栏无限级分类
  2. PHP中try、catch、finally的执行顺序
  3. Windows10下搭建JavaWeb开发环境
  4. SVN共享链接时,避免使用服务器地址,要使用根目录(^)
  5. error: ‘VPX_IMG_FMT_RGB32’ undeclared (first use in this function); did you mean ‘VPX_IMG_FMT_NV12’?
  6. 文字处理技术:完成了对表格的布局处理
  7. LINUX双击无法启动解决一例
  8. 卫星地图上,深圳梧桐山这一条白线是什么
  9. gstreamer之RTSP Server一个进程提供多路不同视频
  10. XCODE中,修改苹果APP支持哪些设备