给类传递参数
有时对一个类的某些方面进行 参数化(parameterize)是很有用的。例如, 你可能需要管理不同版本的 gem 软件包,既可以为每一种版本创建分离的单独的类, 也可以使用继承和覆盖,为一个类传递一个版本号作为参数。
操作步骤
声明参数作为如下类定义的一部分:
class eventmachine( $version ) { package { "eventmachine": provider => gem, ensure => $version, } }
然后在一个节点上使用如下语法包含类:
class { "eventmachine": version => "0.12.8" }
工作原理
类定义:
class eventmachine( $version ) {
与普通的类定义一样,不同之处在于它携带了一个参数:$version。 在此类中,我们定义了如下的 package 资源:
package { "eventmachine":
provider => gem,
ensure => $version,
}
这是一个 gem 包资源,并且要求安装 $version 版本的软件包。
当你在一个节点上包含这个类时, 替换通常的语法:
include eventmachine
为如下的 class 语句:
class { "eventmachine": version => "0.12.8" }
这有相同的效果,只是同时为参数 $version 指定了一个值。
更多用法
你可以为一个类指定多个参数:
class mysql( $package, $socket, $port ) {
使用同样的方法为其传递参数值:
class { "mysql":
package => "percona-sql-server-5.0",
socket => "/var/run/mysqld/mysqld.sock",
port => "3306",
}
你也可以为一些参数指定默认值:
class mysql( $package, $socket, $port = "3306" ) {
或者使用如下代码片段为所有参数指定默认值:
class mysql(
package = "percona-sql-server-5.0",
socket = "/var/run/mysqld/mysqld.sock",
port = "3306" ) {
与 define 不同,一个节点上只能存在一个参数化的类实例。 所以当你需要针对一个资源创建多个不同的实例时,应该使用 define 取代类的参数化。