如何多次运行同一个类?

时间:2014-08-19 10:30:11

标签: ruby puppet

我有一个puppet模块,它可以部署一个JAR文件并编写一些属性文件(通过使用ERB模板)。 最近我们为应用程序添加了“模式”功能,这意味着应用程序可以根据清单中输入的值以不同的模式运行。 我的层次结构如下:

设置

*配置

**文件

*安装

含义setup调用config类和install类。 安装类根据模式部署相关的RPM文件

config类检查模式,并且每种模式使用特定的模式和目录参数调用files类,这种结构的原因是属性的值取决于实际模式。

技术问题是如果我在清单中有多个模式(这是我的目标),我需要调用两次文件类:

if grep($modesArray, $online_str) == [$online_str] {
    class { 'topology::files' :
      dir   => $code_dir,
      mode  => $online_str
    }
  }

  $offline_str = "offline"
  $offline_suffix = "_$offline_str"
  if grep($modesArray, $offline_str) == [$offline_str] {
    $dir = "$code_dir$offline_suffix"
    class { 'topology::files' :
      dir   => $dir,
      mode  => $offline_str
    }

然而,在木偶中,你不能两次宣布同一个班级。

我试图找出如何调用类两次,或者我可以从ERB文件中访问其参数的方法,但我无法弄清楚

文档说这是可能的,但没有说明(我在这里查看https://docs.puppetlabs.com/puppet/latest/reference/lang_classes.html#declaring-classes)。

总结一下,有没有办法:

  1. 使用不同的参数再次调用同一个类
  2. (其他一些方法)基于相同的ERB文件创建多个文件(每次都有不同的参数)

2 个答案:

答案 0 :(得分:6)

您可以简单地将您的类声明为define:

define topology::files($dir,$mode){
  file{"${dir}/filename":
    content=> template("topology/${mode}.erb"), 
  }
}

这将为每种模式应用不同的模板

然后,根据需要多次实例化它:

if grep($modesArray, $online_str) == [$online_str] {
    topology::files{ "topology_files_${online_str}" :
      dir   => $code_dir,
      mode  => $online_str
    }
  }

  $offline_str = "offline"
  $offline_suffix = "_$offline_str"
  if grep($modesArray, $offline_str) == [$offline_str] {
    $dir = "$code_dir$offline_suffix"
    topology::files{ "topology_files_${online_str}" :
      dir   => $dir,
      mode  => $offline_str
    }

答案 1 :(得分:0)

您对文档的解释是不合时宜的。

Puppet中的类应该被视为单例。每个类只有一个实例。它是节点清单的一部分,或者不是。清单可以使用include关键字随时声明该类。

请注意使用语法等资源进行声明。

class { 'classname': }

这可能会在清单中出现最多一次。参数值现在永久绑定到您的类。您的节点已选择该类应采用的具体形状。

没有看到您班级的代码,您的问题让我相信您正在尝试使用Puppet作为脚本引擎。它不是。 Puppet只允许您建模目标状态。有一些强大的机制可以实现复杂的工作流来实现该状态,但是你不能用它来以任意顺序运行任意转换。

如果您添加了类代码,我们可以尝试提供一些有关如何重构它以使Puppet满足您需求的建议。不过,我担心这可能是不可能的。如果确实有必要在事务期间在不同时间将一个或多个资源同步到不同的状态(脚本引擎?;-),则应该将整个工作流实现为实际脚本并让Puppet通过{{1}运行在适当的时候提供资源。