2014-12-30 35 views
1

我已經實現了兩個傀儡模塊設置和配置兩個組件 - 甲& B.模塊夾看起來像下面的目錄結構:如何處理puppet模塊中的代碼重複?

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的代碼是相同兩個模塊。在與2屬性文件modulea交易config.pp的代碼,而代碼與5個屬性文件moduleb交易config.pp。在這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, } 
} 

我有什麼選擇,以減少重複代碼,提高代碼的可維護性?我有什麼選擇,以便我可以輕鬆地在未來增加一個具有相同模式的模塊?

+0

它是好的。您可以在不同模塊中重複使用模板文件。 – BMW

+0

我應該在哪裏保存那些由多個模塊使用的模板文件?如何處理其他文件中存在的其他代碼重複? –

+0

你可以鏈接它們。將模板文件夾放在一個模塊中,並鏈接到其他模塊。 – BMW

回答

2

爲了避免傀儡代碼重複,我通常創建「通用類」。 我還建議使用hiera進行參數化通用類。 更多關於hiera:https://docs.puppetlabs.com/hiera/1/

作爲一個例子: 類常見::安裝程序:

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中,取決於你的機器配置常見::安裝程序的罰款應有的價值::包

如 在machineA.yaml

common::installer::packages: 
    - packageA 
    - packageB 
    - packageC 
在machineB.yaml

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

這也爲您提供了機會,同時安裝模塊和B在一臺機器上沒有任何衝突。

就在hiera創建適當的配置machineAandB.yaml與

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

您也可以考慮使用ensure_package,以避免與包裝的重複定義惱人的傀儡錯誤,但上面的代碼,我將不會發生。

您可以用來確保所需服務正在運行的類似代碼。

相關問題