摘要:摘要: 个人近期将发布puppet自动化运维的亲身实战,有很多来之网上的文档,特别是http://kisspuppet.com和《Puppet实战》的。此次推出puppet的函数,欢迎网友指正。
定义使用和类相同的基本形式,不同的是它们使用关键字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的函数就结束了,接下来的是模块的学习,请听下回分解!!!
相关文章推荐
虚拟主机的专业参数,分别都是什么意思?2022-09-09
中非域名注册规则是怎样的?注册域名有什么用处? 2022-01-10
HostEase新年活动促销 美国/香港主机全场低至五折2021-12-28
HostGator下载完整备份教程分享2021-12-28
Flink中有界数据与无界数据的示例分析2021-12-28