给类传递参数

有时对一个类的某些方面进行 参数化parameterize)是很有用的。例如, 你可能需要管理不同版本的 gem 软件包,既可以为每一种版本创建分离的单独的类, 也可以使用继承和覆盖,为一个类传递一个版本号作为参数。

操作步骤

  1. 声明参数作为如下类定义的一部分:

    class eventmachine( $version ) {
        package { "eventmachine":
            provider => gem,
            ensure   => $version,
        }
    }
    
  2. 然后在一个节点上使用如下语法包含类:

    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 取代类的参数化。

参见本书