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 类
原文:http://blog.51cto.com/ghbsunny/2044324
来源: http://www.bubuko.com/infodetail-2407529.html