×
新网 > 虚机资讯 > 正文

puppet自动化运维之函数

摘要: 个人近期将发布puppet自动化运维的亲身实战,有很多来之网上的文档,特别是http://kisspuppet.com和《Puppet实战》的。此次推出puppet的函数,欢迎网友指正。

定义使用和类相同的基本形式,不同的是它们使用关键字define(而不是class),并且定义支持参数但不支持继承。就像之前所提到的,定义可以接收参数并在相同的系统上多次重用。

注:define最好在定义时,使用变量,赋值就可以使用class。

timg (14).jpg

 

1.无变量格式:

 

define 函数名() {

type { "title ":

    attribute => "value",

...

attribute => "value";

   }

...(各种资源)

type { "title ":

    attribute => "value",

...

attribute => "value";

   }

}

 

 

2.有变量格式:

 

define 函数名(变量名1,...,变量名n) { #格式:$var

type { "title ":

    attribute => "变量名", #格式:${var},下同

...

attribute => "变量名";

   }

...(各种资源)

type { "title ":

    attribute => "变量名",

...

attribute => "变量名";

   }

}

 

 

3.在class中定义define:

 

class 类名 {

define 函数名 (变量名1,...,变量名n) {

type { "title ":

     attribute => "变量名", #格式:${var},下同

...

attribute => "变量名",

   }

...(各种资源)

type { "title ":

     attribute => "变量名",

...

attribute => "变量名",

   }

}

}

 

 

 

4.引用define: ①.一般情况(无class):

 

函数名 {

变量名 => "值",

...

变量名 => "值",

}

 

 

例:

#①定义了一个definition 用来执行一个脚本去配置一个新的主机.

define newip ( $ip ) {

exec { "/sbin/ifconfig" $title $ip ":

}

}

 

#引用

newip { eth0:

ip => "11.11.11.11"

}

 

#或

newip(11.11.11.11) {"eth0":

}

 

 

 

②.class类引用

 

类名::函数名 {

变量名 => "值",

...

变量名 => "值",

}

 

例:

我们创建了一个definition叫做newip并且有一个参数叫做$ip,内部定义了我们用来执行资源类型内部二进制代码,这里是ifconfig 命令,我们已经指出变量$ip和使用的另一个变量$title($name)

 

#②同上,不过使用了类class

class virtuals {

define newip ( $ip ) {

exec { "/sbin/ifconfig $title $ip":

}

}

}

 

#引用

virtuals::newip { eth0:

ip => "11.11.11.11",

}

#

virtuals::newip(11.11.11.11) { eth0:

}

 

 

#③声明多个参数列表,以逗号分割:

define webapp( $domain, $path, $platform ) {

...

}

webapp { "mywizzoapp":

domain => "mywizzoapp.com",

path => "/var/www/apps/mywizzoapp",

platform => "Rails",

}

 

 

#④创建了一个函数(define),并只添加了一个参数,参数又是实例的名字.但是,我们也可以添加任何我们想要的参数,因此我们只要在函数中进行声明.

 

define tmpfile( $greeting ) {

file { "/tmp/$name":

content => $greeting,

}

}

 

在声明实例资源的时候,并传递相应的变量值.

tmpfile{ "foo": greeting => "Hello, world" }

 

 

 

#⑤为每一个参数指定一个默认的值

define config_file(owner = root, group = root, mode = 0644,source, backup = false, recurse = false, ensure = file ) {

file{ $name:

mode => $mode,

owner => $owner,

group => $group,

backup => $backup,

recurse => $recurse,

ensure => $ensure,

source => "puppet:///$source"

}

}

 

config_file { "/etc/vnc.conf":

source => "vnc/vnc.conf",

mode => "0640"

}

 

我们创建了config_file定义, 然后对其应用,这跟函数调用差不多。

 

 

5.类 VS 定义

类和定义的创建过程都很相似(但类不接收参数),不过他们使用起来非常不同。

定义是用来定义在一个主机上包含多个实例的可重用对象的,所以定义不能包含任何只能有一个实例的资源。比如,多次使用同一个定义不能创建相同的文件。

类是独一无二的,无论你包含它们多少次,你只会得到资源的一个副本。

大多数时候,服务会被定义成类,服务的包,配置文件以及正在运行的服务都会被定义在类中,因为通常在每一个主机上它们都只有一个副本。(这些有时被惯称为“服务——包——文件”)。

定义是用来管理类似虚拟主机这样可以有许多的资源,或者使用一个可重用的封装来包装一些简单的信息,以此来减少代码量。


至此,puppet的函数就结束了,接下来的是模块的学习,请听下回分解!!!

 

  • 相关专题

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣

Loading