一、基本概念

  • 资源:是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的类,包含sslvirtual_host两个类。那么在manifests目录同时有3个文件:init.ppssl.ppvirtual_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  在同一类型的资源中titlenamevar都是唯一的

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

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

 

资源清单manifests

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

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

 

资源之间的依赖关系

    require

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

    before

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

 

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

 

    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)资源之间的依赖关系

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

    例: require =>Package{‘aaa’}

 

常用资源:

1)用户资源user

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

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

  • expiry:过期时间

  • gid:用户组ID

  • groups:用户组

  • home:家目录

  • shell:指定shell

  • system:指定是否系统用户

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

  • passwd:密码

 

    例:

    创建用户dx并指定uid555,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:指定是否创建系统组


    例:

    创建一个gid15dx组,组内有两位用户成员aabb

    groups { ‘dx’:

         ensure=> present,

         name=> ‘dx’,

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

         }

 

3)软件安装package

常用参数:

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

  • ensure:设置软件包状态。installed表示要安装该软件,也可以学成presentobsent卸载,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:文件的内容,与sourcetarget属性互斥

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

  • owner:用户名或用户ID

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

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

  • link:软件连接

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

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

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

  • recurse:递归目录,值为truefalseinfremote

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

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

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

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

 

    例:

    创建一个文件

    file {‘/tmp/aa.txt’:

         ensure=> file,

         }

 

    指定资源titletest,利用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属性定义时使用的”///”是省略了本地puppetmasterservername,在没有定义fileserver的情况下,puppet默认会去master模块本地的files文件目录查找

 

5)服务管理service

常用参数:

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

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

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

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

  • 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效果。

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

 

6)定时脚本cron

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

常用参数:

  • ensure:可配置为presentabsent

  • 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,可以定义为truefalse

  • 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需要配置subscribenotify才有意义

 

 

四、模块

模块是多个类的集合。

 

模块的结构:

#/etc/puppet/modules/test模块

wKiom1b6EcCwtFlsAAAiMM9hPiI959.jpg

 

模块的目录及命名通常以应用软件来命名,好处是可以一目了然的知道此模块的功能。每个模块都包含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类,类中包含资源packagefileservice,其中service依赖于filenginx.conf文件内容采用content定义来源于template中对应的nginx.conf.erb模板内容

 

 

五、类

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

1)类的定义

    class class_name { ... }

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

    class nginx { ... }

    class nginx::config { ... }

    class nginx::vhost { ... }

 

    configvhostnginx的子类

 

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模板中的内容会原封不动的传送回puppetERB标签如下,可包含一行或多行:

    <% document = “” %>

 

2)打印、输出表达式

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

    <%= aaa %>

 

3)注释

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

    <%# ... %>

 

模板结合

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

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

 

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

 

 

七、节点

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

    例:

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

    #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个变量直接应用到该节点内,同时还包含了generalhttpd::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,如果没有使用的情况下,将会导致性能下降,如果没有特殊需求,建议采用basenodebaseclass(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”: }

    }

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