Puppet 之 类的介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Puppet 之 类的介绍相关的知识,希望对你有一定的参考价值。
1 概述puppet的类:把多个相关的资源定义在一起,组成一个类.可以在其他的代码段include这个类.puppet还支持有限制的类的继承,作用就是在子类里面的属性可以覆盖父类里面的属性.
类:puppet中命名的代码模块,常用于定义一组通用目标的资源,可在puppet全局调用;
类可以被继承,也可以包含子类;
类的名称只能以小写字母开头,可以包含小写字母、数字和下划线
每个类都会引入一个新的变量scope,这意味着任何时候访问类中的变量时,都得使用其完全限定名称,不过,在本地scope可以重新为top scope中的变量赋予一个新值
2 语法介绍
语法格式:
class NAME { ...puppet code... }
#以下定义类,并传递参数
class NAME(parameter1, parameter2) { ...puppet code... }
类的调用
类代码只有声明后才会执行,调用方式:
(1) include CLASS_NAME1, CLASS_NAME2, ...
(2) class {'CLASS_NAME':
attribute => value,
}
例子
定义类并通过include调用
class instwebsvr { $webserver = $osfamily ?{ "RedHat" => 'httpd', /(?i-mx:debian)/ => 'apache2', default => 'httpd', } package {"$webserver": ensure => installed, } } include instwebsvr
示例2:传递参数,
class dbserver($pkg,$srv){ package {"$pkg": ensure => latest, before => Service["$srv"], } service{"$srv": ensure => running, } } if $operatingsystem =="CentOS" or $operatingsystem == "RedHat" { case $operatingsystemmajrelease { '7':{$pkgname = 'mariadb-server' $srvname='mariadb'} default:{$pkgname = 'mysql-server' $srvname='mysqld'} } } #声明类,向形参传递参数,这里实参$pkgname和形参$pkg不同名。可以同名,但是建议不同名比较合理,容易区分 class {'dbserver': pkg => "$pkgname", srv => "$srvname", }
定义赋值,如果变量没有传值为空值,就直接使用括号内的值,如果有传值,就使用变量传过来的为准,例子如下
class dbserver($pkg='mariadb-server',$srv='mariadb'){ package {"$pkg": ensure => latest, before => Service["$srv"], } service{"$srv": ensure => running, } } if $operatingsystem =="CentOS" or $operatingsystem == "RedHat" { case $operatingsystemmajrelease { '7':{$pkgname = 'mariadb-server' $srvname='mariadb'} default:{$pkgname = 'mysql-server' $srvname='mysqld'} } } class {'dbserver': pkg => "$pkgname", srv => "$srvname", }
类继承的方式
如父类中的参数不完整,在子类中在丰富一些参数,子类可以继承父类的参数,实现代码的复用
class SUB_CLASS_NAME inherits PARENT_CLASS_NAME { ...puppet code... }
#引用父类中的service,引用用中括号,后面用花括号增加选项,花括号里的选项优先级比引用的高。符号+>表示在原来值的基础上增加选项
在子类中为父类的资源新增属性或覆盖指定的属性的值:
Type['title'] { attribute1 => value, ... }
在子类中为父类的资源的某属性增加新值:
Type['title'] { attribute1 +> value, ... }
示例1:
当nginx的子配置文件发生变化时,子类调用父类中的资源和参数,实现代码复用
class nginx { package{'nginx': ensure => installed, } service{'nginx': ensure => running, enable => true, restart => '/usr/sbin/nginx -s reload', } } #nginx::web:是指 父类::子类 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', } }
示例2:
使用puppet分别实现主从redis
准备主从节点的配置文件
主节点73配置文件修改如下两处
vim redis-slave.conf bind 0.0.0.0 port 6379
从节点72配置文件修改如下三处
vim redis-slave.conf bind 0.0.0.0 port 6379 slaveof 172.18.50.72 6379
这里使用单机模式,所以需要把文件复制到对应机器,然后调用定义都不一样,如下,67和68都要安装puttet.注意如果是主从模式,就不需要这么操作,这里主要是演示单机模式(standalone)的情况。将主从的配置文件模板拷贝到对应的机器的/root/puppet/redis.module目录下。进行puppet配置
主节点73上配置
vim redis_master.pp class redis { package{'redis': ensure => latest, before => Service['redis'], } service{'redis': ensure => running, enable => true, hasrestart => true, restart => 'service redis restart', require => Package['redis'], } } class redis::master inherits redis { file{'/etc/redis.conf': ensure => file, source => '/root/puppet/redis.module/redis-master.conf', owner => redis, group => root, require => Package['redis'], } Service['redis'] { restart => 'systemctl restart redis.service', subscribe => File['/etc/redis.conf'], } } include redis::master
从节点72上配置
vim redis_slave.pp class redis { package{'redis': ensure => latest, } service{'redis': ensure => running, enable => true, hasrestart => true, restart => 'service redis restart', require => Package['redis'], } } class redis::slave inherits redis { file{'/etc/redis.conf': ensure => file, source => '/root/puppet/redis.module/redis-slave.conf', owner => redis, group => root, require => Package['redis'], } Service['redis'] { restart => 'systemctl restart redis.service', subscribe => File['/etc/redis.conf'], } } include redis::slave
测试:
在主从节点上分别运行
puppet apply redis-master.pp puppet apply redis-slave.pp
然后在主节点上操作
redis-cli 127.0.0.1:6379> SET mykey 'hello,i am master 73' OK 127.0.0.1:6379> get mykey
从节点上验证
redis-cli 127.0.0.1:6379> get mykey "hello,i am master 73"
则redis主从通过puppet配置成功
以上是关于Puppet 之 类的介绍的主要内容,如果未能解决你的问题,请参考以下文章