如何将两个或多个变量传递给Puppet中的Define

时间:2015-11-13 12:47:57

标签: puppet puppet-enterprise librarian-puppet

我在define中传递了多个参数。

以下是我的代码。我想在define中传递两个数组,但是我只能传递一个,如下所示。

 class test {   
    $path = [$path1,$path2]
    $filename = [$name1,$name2]
    define testscript { $filename: } // Can able to pass one value. 
 }

 define testscript () {
     file {"/etc/init.d/${title}": //Can able to receive the file name.
           ensure  => file,
           content => template('test/test.conf.erb'), 
 }

从上面的代码中,我可以检索define资源中的filename。我还需要path来设置模板中的值。我无法在模板中发送/检索第二个参数。

有没有办法改进我的代码以在define资源中传递两个值($path$filename)?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

  

有没有办法改进我的代码以在define资源中传递两个值($ path和$ filename)?

Puppet有很好的文档,covers this area很好。

首先,您需要了解定义的类型是一种资源类型,几乎在任何类似于任何内置或扩展类型的方式。如果您定义的类型接受参数,那么您可以将值绑定到这些参数,就像在任何其他资源声明中一样。例如:

class mymodule::test {   
   mymodule::testscript { $name1: path => $path1 }
   mymodule::testscript { $name2: path => $path2 }
}

define mymodule::testscript ($path) {
  file {"${path}/${title}":
    ensure  => 'file',
    content => template('test/test.conf.erb')
  }
}

此外,由于定义的类型是资源类型,因此您应该放弃“传递”值的概念,就好像它们是函数一样。那种心理模型可能会背叛你。特别是,如果您将数组或哈希指定为资源标题,它肯定会给您错误的期望。

特别是,您需要了解在任何资源声明中,如果您将资源标题作为数组提供,那么这意味着每个数组成员都有一个单独的资源,数组成员作为该资源的标题。在这种情况下,这些资源中的每一个都接收相同的参数值,如声明正文中声明的那样。而且,资源标题总是字符串。除了一个级别的数组,如上所述,如果您将其他任何内容作为资源标题,那么它将被转换为字符串。