如何在Puppet中创建相同的资源两次

时间:2014-08-21 12:00:11

标签: puppet

我的要求是使用循环执行一些重复的文件配置,如下所示,

$no_of_managers = 2
$array = ['One','two','Three']


define loop() {

notice("Configuring The Manager Nodes!!")

if ($name == $no_of_managers+1) {
    notice("Loop Iteration Finished!!!")
  }
  else
  {
    notice("Iteration Number : $name \n")

    # Doing All Stuff Here 

resource {$array:}

    $next = $name + 1
    loop { $next: }
 }
 }

loop { "1":}

define resource () {
# Doing my other Stuff
notice ("The Parsed value Name : ${name}\n")

}

现在,当第二次迭代运行时,会发生以下错误,

Error: Duplicate declaration: Resource[One] is already declared in file 

我如何克服这一点,我正在做的是群集设置。有没有办法做到这一点,我是木偶的新手,所以你的善意指导高度赞赏。

用例:

我正在尝试设置一个具有多个Manager / Worker节点的集群。因此,使用此脚本,用户有权选择他需要多少个管理器节点。因此,第一个循环是为了复制必要的文件并创建所需数量的节点。

第二个循环用于推送所有.erb模板。因为每个节点的配置略有不同,所以.erb文件里面有自己的逻辑。

因此,在每次迭代后,我想将.erb模板推送到相应的节点。

1 个答案:

答案 0 :(得分:2)

在Puppet 3.x中,你无法以你正在尝试的方式构建一个循环。

resource { $array: }
如果愿意,

是对$array内容的循环。

你要解决的问题并不是很清楚。如果您可以使您的问题更具体,我们可能会建议实际实施。

更新

如果你真的想走这条路,你需要为派生资源生成唯一的名称。

$local_names = regsubst($array, '$', "-$name")

resource { $local_names: }

在您定义的类型中,您必须通过删除后缀来检索原始含义。

define resource() {
    $orig_name = regsubst($name, '-[0-9]+$', '')
    # use $orig_name where you used $name before
}

请注意,即使导出的资源也必须具有唯一的名称。因此,转换可能必须在接收节点的清单中发生。