如何处理puppet模块中的代码重复?

如何处理puppet模块中的代码重复?,puppet,reusability,maintainability,Puppet,Reusability,Maintainability,我已经实现了两个puppet模块来设置和配置两个组件-A和B。模块文件夹的目录结构如下所示: modules modulea manifests init.pp install.pp config.pp service.pp templates 1.properties.erb (This one

我已经实现了两个puppet模块来设置和配置两个组件-A和B。模块文件夹的目录结构如下所示:

modules
     modulea
          manifests
               init.pp
               install.pp
               config.pp
               service.pp
          templates
               1.properties.erb (This one is also needed by moduleb)
               2.properties.erb (This one is also needed by moduleb)
     moduleb
          manifests          
               init.pp
               install.pp
               config.pp
               service.pp 
          templates
               1.properties.erb (same as in modulea)
               2.properties.erb (same as in modulea) 
               3.properties.erb
               4.properties.erb
               5.properties.erb
install.pp和service.pp中的代码在这两个模块中是相同的。modulea的config.pp中的代码处理2个属性文件,而moduleb的config.pp中的代码处理5个属性文件。在这5个属性文件中,2个属性文件与modulea完全相同,而3个属性文件特定于moduleb

下面粘贴的是install.pp和service.pp代码:

**init.pp of modulea**
class modulea::install inherits modulea {
  package { $package_name: ensure => present }
}

**init.pp of moduleb**
class moduleb::install inherits moduleb {
  package { $package_name: ensure => present }
}

**service.pp of modulea**
class modulea::service inherits modulea {
  service { $service_name: ensure => running, }
}

**service.pp of moduleb**
class moduleb::service inherits moduleb {
  service { $service_name: ensure => running, }
}

我有哪些选项可以减少代码重复并提高代码的可维护性?我有哪些选项可以方便地在将来添加一个具有相同模式的模块?

为了避免伪代码重复,我通常创建“公共类”。 我还建议使用hiera参数化公共类。 更多关于希拉的信息:

例如: 类公共::安装程序:

modules
    common
        installer.pp
代码为:

class common::installer {
   $packages = hiera("common::installer::packages")
   package { $packages:
     ensure => latest,
   }
}
接下来在所有模块中添加

require common::installer #or include common::installer, with this you will avoid "already defined" errors in puppet. 
在hiera中,根据机器配置,您可以定义common::installer::packages的正确值

e、 g 在机械方面

 common::installer::packages:
   - packageA
   - packageB
   - packageC
在b.yaml中

 common::installer::packages:
   - packageA
   - packageB
   - packageD
   - packageE
这也使您有机会在一台机器上安装模块A和B,而不会产生任何冲突

仅在hiera中,使用创建适当的配置machineAandB.yaml

 common::installer::packages:
   - packageA
   - packageB
   - packageC
   - packageD
   - packageE

您也可以考虑使用EnSuReSo包,避免重复定义包的烦扰木偶错误,但是上面的代码我不会发生。


您可以使用类似的代码来确保所需的服务正在运行。

这很好。您可以在不同的模块中重用模板文件。我应该将多个模块正在使用的模板文件保存在哪里?如何处理其他文件中存在的其他代码重复?您可以链接它们。将模板文件夹放在一个模块中,并链接到其他模块。那么模块B是模块a的超集?为什么不直接从B调用A而不是复制任何代码呢?包名是不同的。服务名称不同。就属性文件而言,B是A的超集。