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 之 类的介绍的主要内容,如果未能解决你的问题,请参考以下文章

Puppet 之 模板和模块

Puppet 之 相关概念和命令介绍

Puppet 之 八大资源介绍

Puppet 之 流程控制介绍

Puppet之基础篇

Puppet 之 tag 和 变量介绍