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

时间:2014-12-30 14:14:48

标签: puppet reusability maintainability

我已经实施了两个木偶模块来设置和配置两个组件 - A& B. modules文件夹的目录结构如下所示:

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, }
}

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

1 个答案:

答案 0 :(得分:2)

为避免木偶代码重复,我通常会创建"普通类"。 我还建议使用hiera来参数化公共类。 关于hiera的更多信息:https://docs.puppetlabs.com/hiera/1/

举个例子: class common :: installer:

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 在machineA.yaml

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

在machineB.yaml

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

这也让您有机会在一台机器上安装模块A和B,没有任何冲突。

在hiera中使用

创建正确的config machineAandB.yaml
 common::installer::packages:
   - packageA
   - packageB
   - packageC
   - packageD
   - packageE

您还可以考虑使用ensure_package,以避免因重复定义包而导致的傀儡错误,但是使用上面的代码我将不会发生。

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