puppet自动化运维之函数

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

额济纳网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联公司从2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司

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

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的函数就结束了,接下来的是模块的学习,请听下回分解!!!


当前标题:puppet自动化运维之函数
当前网址:http://pwwzsj.com/article/chcges.html