定义使用和类相同的基本形式,不同的是它们使用关键字define(而不是class),并且定义支持参数但不支持继承。就像之前所提到的,定义可以接收参数并在相同的系统上多次重用。
注: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的函数就结束了,接下来的是模块的学习,请听下回分解!!!