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自动化运维之函数
当前URL:http://cdiso.cn/article/chcges.html