如何多次运行同一个类?

Sig*_*ani 7 ruby puppet

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

建立

*配置

**文件

*安装

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

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

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

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
    }
Run Code Online (Sandbox Code Playgroud)

但是,在puppet中,你不能两次声明同一个类.

我想弄清楚我怎么可以两次调用一个类,或者也许我可以从我的ERB文件中访问它的参数,但我无法弄清楚这一点

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

总结一下,有没有办法:

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

Rau*_*res 6

您可以简单地将您的类声明为一个定义:

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

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

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

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
    }
Run Code Online (Sandbox Code Playgroud)