我的要求是使用循环执行一些重复的文件配置,如下所示,
$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模板推送到相应的节点。
答案 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
}
请注意,即使导出的资源也必须具有唯一的名称。因此,转换可能必须在接收节点的清单中发生。