博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Puppet函数介绍(十八)
阅读量:7105 次
发布时间:2019-06-28

本文共 18009 字,大约阅读时间需要 60 分钟。

puppet函数

        puppet函数主要用途是完成一个功能的集合,puppet的函数很多,只例举常用的几个.

define函数

        define函数主要用于创建自定义函数,define支持参数但不支持继承.通常可以通过define函数将多个资源整合为一个资源.

define函数示例(crontab计划任务模块):

        新建cron模块,依次建{templates,manifests,lib,files}文件夹,模块资源清单文件manifests下必须有init.pp文件,定义此模块的类且类名唯一.

init.pp文件声明使用cron模块下的basescript类资源.

class cron {    include cron::basescript}

basescript.pp类文件定义资源.

注释:把/root/bin下匹配到的脚本文件发送到各agent端的/root/bin文件夹下,同时定义crontab计划任务.

class cron::basescript{    file {"/root/bin":    ensure=> directory,    mode=>755,}    define webcronscript ($mode = "755") {        file { "/root/bin/$name" :            source => "puppet:///modules/cron/root/bin/$name",            mode   => $mode,            require=> File["/root/bin"],        }    }    webcronscript { ["check_ping.sh","check_hostname.sh"]: }        file { "/etc/cron.d/auto-task":            owner  => root,            group  => root,            mode   => 644,            source => "puppet:///modules/cron/etc/cron.d/auto-task",        }}

cron模块file文件夹下依次创建/root/bin目录及个脚本文件.

脚本文件路径:

cron计划任务:

puppet 入口文件import载入nodes.pp文件.

#----site.pp----import"nodes"

node.pp文件base节点载入cron模块.

node base {    include admin    include cron}node /sh-(proxy|web)\d+/  inherits base {    case $::hostname {        /sh-proxy\d+/: {             include apache          }        "sh-web1": {             include nginx::nginxconf             include php          }         }}

sh-proxy2和sh-web1两台agent端更新测试:

[root@sh-proxy2 ~]# puppet agent -tInfo: Retrieving pluginfactsInfo: Retrieving pluginInfo: Loading factsInfo: Caching catalog for sh-proxy2.localdomainInfo: Applying configuration version '1506525578'Notice: /Stage[main]/Admin/Exec[selinux]/returns: executed successfullyNotice: /Stage[main]/Cron::Basescript/File[/root/bin]/ensure: createdNotice: /Stage[main]/Cron::Basescript/Cron::Basescript::Webcronscript[check_ping.sh]/File[/root/bin/check_ping.sh]/ensure: defined content as '{md5}a68da6e8a332234afa8c9d3c2834c5df'Notice: /Stage[main]/Cron::Basescript/Cron::Basescript::Webcronscript[check_hostname.sh]/File[/root/bin/check_hostname.sh]/ensure: defined content as '{md5}47b425aa5853a5487c139957101cb08c'Notice: Finished catalog run in 0.44 seconds

[root@sh-web1 bin]# puppet agent -tNotice: Ignoring --listen on onetime runInfo: Retrieving pluginfactsInfo: Retrieving pluginInfo: Loading factsInfo: Caching catalog for sh-web1.localdomainInfo: Applying configuration version '1506522880'Notice: /Stage[main]/Admin/Exec[selinux]/returns: executed successfullyNotice: /Stage[main]/Cron::Basescript/Cron::Basescript::Webcronscript[check_ping.sh]/File[/root/bin/check_ping.sh]/ensure: defined content as '{md5}a68da6e8a332234afa8c9d3c2834c5df'Notice: /Stage[main]/Cron::Basescript/File[/etc/cron.d/auto-task]/ensure: defined content as '{md5}d77faa0254d615e0fcb646beb73a91e3'Notice: /Stage[main]/Cron::Basescript/Cron::Basescript::Webcronscript[check_hostname.sh]/File[/root/bin/check_hostname.sh]/ensure: defined content as '{md5}47b425aa5853a5487c139957101cb08c'Notice: Finished catalog run in 0.53 seconds

tagged函数用法:

tagged通过tag为资源做标记,并通过tagged函数判断被标记的类与类之间的关系.

下面通过php模块演示:

modules/php/init.pp文件内容:

class php {    include php::phpfpmconf    $packages = ['php','php-devel']        package {[$packages]:        ensure=> "installed"    }    package {"php-fpm":        ensure => present,    }    service {"php-fpm":        ensure=> running,        enable=> true,        hasrestart=> true,        hasstatus=> true,        provider => init,        require=> Package["php-fpm"],    }}

modules/php/phpfpmconf.pp函数文件内容:

注释:通过tagged函数来区分php参数,即各个类型主机匹配的资源.

class php::phpfpmconf {define generatePHPFpmFiles () { if tagged("web::proxy") {      /* web::proxy */      $sock_max_children = 50      $sock_max_spare_servers = 20      $sock_start_servers = 12      $www_max_children = 20      $www_max_spare_servers = 20      $www_start_servers = 12      $need_apc = false      $display_errors = "on"      $sock_max_requests = 5000      $www_max_requests = 5000      $memory_limit = 1024      $max_execution_time = 300      $slowlog_timeout = 10      $post_max_size="12M"      $upload_max_filesize="12M"    } else {      /* web */      $sock_max_children =20      $sock_max_spare_servers = 20      $sock_start_servers = 12      $www_max_children = 20      $www_max_spare_servers = 20      $www_start_servers = 12      $need_apc = false      $display_errors = "off"      $sock_max_requests = 500      $www_max_requests = 500      $memory_limit = 1024      $max_execution_time = 300      $slowlog_timeout = 10      $post_max_size="12M"      $upload_max_filesize="12M"    } case $::hostname {    "sh-proxy2" : {        file { "/etc/php-fpm.d/www.conf":            ensure  => file,            content => template('php/www.conf.erb'),            #notify => Service["php-fpm"],    }}    default :{        file { "/etc/php-fpm.d/www.conf":              owner   => "root",              group   => "root",              mode    => "644",              ensure  => "file",              content => template("php/www.conf.erb")                }        }    }}case $::hostname {    /[a-z][A-Z]\d+/ : {      generatePHPFpmFiles { 'dv': }    }    default   : {      generatePHPFpmFiles { $::hostname: }    }  }}

modules/php/templates/www.conf.erb模板内容大致也就是上面那些定义变量的参数:

注释:先安装一台php-fpm,把/etc/php-fpm.d/www.conf文件复制粘贴一份做模板文件,里面参数改改就行.

pm = staticpm.max_children = <%= www_max_children %>pm.start_servers = <%= www_start_servers %>pm.max_spare_servers = <%= www_max_spare_servers %>.....

puppet的node.pp文件,在匹配sh-proxy主机时定义tag标记。

注释:匹配到主机sh-proxy定义tag为web::proxy.

node base {    include admin    include cron}node /sh-(proxy|web)\d+/  inherits base {case $::hostname {    /sh-proxy\d+/: {        tag ("web::proxy")             include php      }      "sh-web1": {              include php            }     }}

agent端更新测试:

[root@sh-proxy2 php-fpm.d]# puppet agent -tInfo: Retrieving pluginfactsInfo: Retrieving pluginInfo: Loading factsInfo: Caching catalog for sh-proxy2.localdomainInfo: Applying configuration version '1506534804'Notice: /Stage[main]/Admin/Exec[selinux]/returns: executed successfullyNotice: /Stage[main]/Php::Phpfpmconf/Php::Phpfpmconf::Generatephpfpmfiles[sh-proxy2]/File[/etc/php-fpm.d/www.conf]/content: --- /etc/php-fpm.d/www.conf2017-03-22 20:29:28.000000000 +0800+++ /tmp/puppet-file20170928-96466-ix9fq8-02017-09-28 01:53:24.115952791 +0800@@ -1,3 +1,13 @@+[global]+; Pid file+; Default Value: none+pid = /var/run/php-fpm_www.pid+++; Error log file+; Default Value: /usr/local/var/log/php-fpm.log+error_log = /var/log/php-fpm/php-fpm.error.log+ ; Start a new pool named 'www'. [www] @@ -9,11 +19,14 @@ ;                            specific port; ;   '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory.-listen = 127.0.0.1:9000++ +listen = 9000+  ; Set listen(2) backlog. A value of '-1' means unlimited. ; Default Value: -1-;listen.backlog = -1+listen.backlog = 4096   ; List of ipv4 addresses of FastCGI clients which are allowed to connect. ; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original@@ -21,7 +34,7 @@ ; must be separated by a comma. If this value is left blank, connections will be ; accepted from any ip address. ; Default Value: any-listen.allowed_clients = 127.0.0.1+;listen.allowed_clients =  ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many@@ -36,9 +49,9 @@ ; Note: The user is mandatory. If the group is not set, the default user's group ;       will be used. ; RPM: apache Choosed to be able to access some dir as httpd-user = apache+user = nobody ; RPM: Keep a group allowed to write in log dir.-group = apache+group = www  ; Choose how the process manager will control the number of child processes. ; Possible Values:@@ -57,7 +70,7 @@ ;                                    of 'idle' processes is greater than this ;                                    number then some children will be killed. ; Note: This value is mandatory.-pm = dynamic+pm = static  ; The number of child processes to be created when pm is set to 'static' and the ; maximum number of child processes to be created when pm is set to 'dynamic'.@@ -67,12 +80,12 @@ ; CGI. ; Note: Used when pm is set to either 'static' or 'dynamic' ; Note: This value is mandatory.-pm.max_children = 50+pm.max_children = 20  ; The number of child processes created on startup. ; Note: Used only when pm is set to 'dynamic' ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2-pm.start_servers = 5+pm.start_servers = 12  ; The desired minimum number of idle server processes. ; Note: Used only when pm is set to 'dynamic'@@ -82,13 +95,13 @@ ; The desired maximum number of idle server processes. ; Note: Used only when pm is set to 'dynamic' ; Note: Mandatory when pm is set to 'dynamic'-pm.max_spare_servers = 35+pm.max_spare_servers = 20   ; The number of requests each child process should execute before respawning. ; This can be useful to work around memory leaks in 3rd party libraries. For ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.-; Default Value: 0-;pm.max_requests = 500+; Default Value: -2+pm.max_requests = 5000  ; The URI to view the FPM status page. If this value is not set, no URI will be ; recognized as a status page. By default, the status page shows the following@@ -118,7 +131,7 @@ ;       anything, but it may not be a good idea to use the .php extension or it ;       may conflict with a real PHP file. ; Default Value: not set -;pm.status_path = /status+pm.status_path = /status   ; The ping URI to call the monitoring page of FPM. If this value is not set, no ; URI will be recognized as a ping page. This could be used to test from outside@@ -135,20 +148,20 @@ ; This directive may be used to customize the response of a ping request. The ; response is formatted as text/plain with a 200 response code. ; Default Value: pong-;ping.response = pong+ping.response = pong   ; The timeout for serving a single request after which the worker process will ; be killed. This option should be used when the 'max_execution_time' ini option ; does not stop script execution for some reason. A value of '0' means 'off'. ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0-;request_terminate_timeout = 0+request_terminate_timeout = 0   ; The timeout for serving a single request after which a PHP backtrace will be ; dumped to the 'slowlog' file. A value of '0s' means 'off'. ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0-;request_slowlog_timeout = 0+request_slowlog_timeout = 10   ; The log file for slow requests ; Default Value: not set@@ -179,24 +192,16 @@ ; Redirect worker stdout and stderr into main error log. If not set, stdout and ; stderr will be redirected to /dev/null according to FastCGI specs. ; Default Value: no-;catch_workers_output = yes+catch_workers_output = yes  -; Limits the extensions of the main script FPM will allow to parse. This can-; prevent configuration mistakes on the web server side. You should only limit-; FPM to .php extensions to prevent malicious users to use other extensions to-; exectute php code.-; Note: set an empty value to allow all extensions.-; Default Value: .php-;security.limit_extensions = .php .php3 .php4 .php5- ; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from ; the current environment. ; Default Value: clean env-;env[HOSTNAME] = $HOSTNAME-;env[PATH] = /usr/local/bin:/usr/bin:/bin-;env[TMP] = /tmp-;env[TMPDIR] = /tmp-;env[TEMP] = /tmp+env[HOSTNAME] = $HOSTNAME+env[PATH] = /usr/local/bin:/usr/bin:/bin+env[TMP] = /tmp+env[TMPDIR] = /tmp+env[TEMP] = /tmp  ; Additional php.ini defines, specific to this pool of workers. These settings ; overwrite the values previously defined in the php.ini. The directives are the@@ -215,12 +220,10 @@ ; Default Value: nothing is defined by default except the values in php.ini and ;                specified at startup with the -d argument ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com-;php_flag[display_errors] = off-php_admin_value[error_log] = /var/log/php-fpm/www-error.log+php_flag[display_errors] = on+php_admin_value[error_log] = /var/log/php-fpm/www.error.log php_admin_flag[log_errors] = on-;php_admin_value[memory_limit] = 128M--; Set session path to a directory owned by process user-php_value[session.save_handler] = files-php_value[session.save_path] = /var/lib/php/session+;php_admin_value[memory_limit] = 32M +;add by zkf . add some file support. p file is used by channel.+security.limit_extensions = .php .php3 .php4 .php5 .html .do .js .css .htm p\ No newline at end of fileInfo: Computing checksum on file /etc/php-fpm.d/www.confInfo: /Stage[main]/Php::Phpfpmconf/Php::Phpfpmconf::Generatephpfpmfiles[sh-proxy2]/File[/etc/php-fpm.d/www.conf]: Filebucketed /etc/php-fpm.d/www.conf to puppet with sum 2402465907d7a7544db6315c55248938Notice: /Stage[main]/Php::Phpfpmconf/Php::Phpfpmconf::Generatephpfpmfiles[sh-proxy2]/File[/etc/php-fpm.d/www.conf]/content: content changed '{md5}2402465907d7a7544db6315c55248938' to '{md5}a8ef2b23bd9feab1848d3dfe27ab1bd6'Notice: Finished catalog run in 0.56 secondsgrep过滤修改的参数查看是否改变了:[root@sh-proxy2 php-fpm.d]# cat www.conf | grep requests; The address on which to accept FastCGI requests.; This value sets the limit on the number of simultaneous requests that will be; The number of requests each child process should execute before respawning.pm.max_requests = 5000; The log file for slow requests

template函数

template函数可以通过file资源调用模块中的*.erb模板文件。

示例(上面的php模板):

content => template("php/www.conf.erb")

template也可以合并模板:

"sh-proxy2" : {     file { "/etc/php-fpm.d/www.conf":        ensure  => file,        content => template("php/www.conf.erb","php/wwwproxy.conf.erb"),        #notify => Service["php-fpm"],    }}

agent端更新后做对比:

合并模板后:

[root@sh-proxy2 php-fpm.d]# cat www.conf | wc -l458

合并模板前:

[root@sh-proxy2 php-fpm.d]# cat www.conf | wc -l228

两个模板就算参数重复也不会覆盖,只是在同一个文件中追加另一个模板的内容.

[root@sh-proxy2 php-fpm.d]# cat www.conf | grep -v '^;' | grep -v '^$' | grep request_terminate_timeoutrequest_terminate_timeout = 0request_terminate_timeout = 0

Generate 函数

generate 函数调用外部命令并且返回结果给Puppet,用法如下:

$interfaces = generate("/sbin/ifconfig", "eth0")

这里定义了一个变量叫做$interfaces,它调用了generate 函数,所有的generate 函数必须有一个指明的命令,然后填入若干参数,这两个直接用逗号分割,返回的结果就是执行命令

# /sbin/ifconfig eth0

注释:将返回结果返回给$interface,命令执行完必须返回状态码为0,返回其他的状态码就会造成解释错误。

本地应用:

示例:

# cat 3.pp $ifip=generate ('/sbin/ifconfig','eth0')notice $ifip
# puppet apply 3.pp Notice: Scope(Class[main]): eth0      Link encap:Ethernet  HWaddr 00:0C:29:06:AF:4B            inet addr:192.168.30.132  Bcast:192.168.30.255  Mask:255.255.255.0          inet6 addr: fe80::20c:29ff:fe06:af4b/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:612647 errors:0 dropped:0 overruns:0 frame:0          TX packets:174442 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:614959446 (586.4 MiB)  TX bytes:24739431 (23.5 MiB)Notice: Compiled catalog for sh-proxy2.localdomain in environment production in 0.06 secondsNotice: Finished catalog run in 0.01 seconds

在puppet代码中嵌入这段代码,获取的就是master端的信息:

node base {    include admin    include cron}node /sh-(proxy|web)\d+/  inherits base {    case $::hostname {    /sh-proxy\d+/: {            tag ("web::proxy")             include php          }    "sh-web1": {        include php        $ifip=generate('/sbin/ifconfig','eth0')        notify {"$ifip":}        }     }}

agent端更新:

192.168.30.134为master端的ip.

[root@sh-web1 ~]# puppet agent -tNotice: Ignoring --listen on onetime runInfo: Retrieving pluginfactsInfo: Retrieving pluginInfo: Loading factsInfo: Caching catalog for sh-web1.localdomainInfo: Applying configuration version '1506606174'Notice: /Stage[main]/Admin/Exec[selinux]/returns: executed successfullyNotice: eth0      Link encap:Ethernet  HWaddr 00:0C:29:53:DD:61            inet addr:192.168.30.134  Bcast:192.168.30.255  Mask:255.255.255.0          inet6 addr: fe80::20c:29ff:fe53:dd61/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:228766 errors:0 dropped:0 overruns:0 frame:0          TX packets:102934 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:107060668 (102.1 MiB)  TX bytes:50130125 (47.8 MiB)Notice: /Stage[main]/Main/Node[sh-proxywebd]/Notify[eth0      Link encap:Ethernet  HWaddr 00:0C:29:53:DD:61            inet addr:192.168.30.134  Bcast:192.168.30.255  Mask:255.255.255.0          inet6 addr: fe80::20c:29ff:fe53:dd61/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:228766 errors:0 dropped:0 overruns:0 frame:0          TX packets:102934 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:107060668 (102.1 MiB)  TX bytes:50130125 (47.8 MiB)]/message: defined 'message' as 'eth0      Link encap:Ethernet  HWaddr 00:0C:29:53:DD:61            inet addr:192.168.30.134  Bcast:192.168.30.255  Mask:255.255.255.0          inet6 addr: fe80::20c:29ff:fe53:dd61/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:228766 errors:0 dropped:0 overruns:0 frame:0          TX packets:102934 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:107060668 (102.1 MiB)  TX bytes:50130125 (47.8 MiB)'Notice: Finished catalog run in 0.32 seconds

versioncmp函数(用的不多):

versioncmp函数用于版本号之间的比较.

versioncmp有三个返回值:

如果版本a大于版本b,则返回1.

如果版本a等于版本b,则返回0.

如果版本a小雨版本b,则返回-1.

puppet代码文件:

# cat 4.pp if versioncmp ('2.6','2.4') > 0 {notice ("2.6 is > than 2.4")}

puppet本地应用:

# puppet apply 4.pp Notice: Scope(Class[main]): 2.6 is > than 2.4Notice: Compiled catalog for sh-web1.localdomain in environment production in 0.06 secondsNotice: Finished catalog run in 0.01 seconds

转载地址:http://gvdhl.baihongyu.com/

你可能感兴趣的文章
什么时候用存储过程
查看>>
【MongoDB for Java】Java操作MongoDB
查看>>
0c-42-ARC模式下如何兼容非ARC的类
查看>>
程序员进阶之路—如何独当一面
查看>>
闲话WPF之十一(Dependency属性 [3] )
查看>>
JS组件系列——基于Bootstrap Ace模板的菜单Tab页效果优化
查看>>
eclipse中tomcat快速启动关闭参数设置
查看>>
C++ extern "c "的作用
查看>>
实践:几十亿条数据分布在几十个节点上的毫秒级实时排序方法
查看>>
PMWiki安装教程
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
一个经典编程面试题的“隐退”
查看>>
POJ2109
查看>>
显示创建一个表的SQL语句
查看>>
光流和KLT
查看>>
Linux c括号作用域【原创笔记】
查看>>
分分钟带你玩转 Web Services【2】CXF
查看>>
ASP.NET MVC+LINQ开发一个图书销售站点(7):图书分类管理
查看>>
如何做一名技术管理者
查看>>
Resouce, platform_device 和 platform_driver 的关系【转】
查看>>