我有一个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 }
但是,在puppet中,你不能两次声明同一个类.
我试图弄清楚我可以如何调用一个类两次,或者也许是一个方法,我可以从我的ERB文件中访问它的参数,但我无法弄清楚这一点
文档说这是可能的,但没有说明如何(我在这里检查了https://docs.puppetlabs.com/puppet/latest/reference/lang_classes.html#declaring-classes).
总结一下,有没有办法:
解决方法
您可以简单地将您的类声明为一个定义:
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,$offline_str) == [$offline_str] { $dir = "$code_dir$offline_suffix" topology::files{ "topology_files_${online_str}" : dir => $dir,mode => $offline_str }