2017-05-25 62 views
1

我有一個模塊來安裝我的應用程序。 要安裝系統的軟件包我使用虛擬資源:木偶根據應用程序版本安裝特定版本的軟件包版本

@package {[ 
    'unzip', 
    'wget', 
    'htop', 
    'xorg-x11-server-Xvfb']: 
     ensure => installed, 
} 

define myapp1_packages { 
    realize(
    Package['unzip'], 
    Package['fontconfig'], 
    Package['libfreetype.so.6']) 
} 
@myapp1_packages{ 'myapp1_packages': } 

然後我用實現我的清單安裝上面的包:

realize(myapp1_packages['myapp1_packages']) 

但我的應用程序的每個版本我也需要適當的系統軟件包的版本。

我需要類似的東西:

if $app_version == '1.0' { 
    "install unzip-1xx" 
    "install fontconfig-1-xx" 
    "install libfreetype.so.6-1-x-xx" 
elseif $app_version == '2.0' 
    "install unzip-2xx" 
    "install fontconfig-2-xx" 
    "install libfreetype.so.6-2-x-xx" 

什麼是最優雅的方式來做到這一點?在這種情況下可以保留虛擬資源嗎?我正在尋找使用ensure_packages,但我擔心資源重複。謝謝您的幫助!

+0

最好的辦法,不要作爲pendOs和閱讀手冊 –

回答

4

這裏要做的最好的事情就是讓$app_version成爲你模塊的一個參數:https://docs.puppet.com/puppet/4.10/lang_classes.html#class-parameters-and-variables。請注意以下文檔中的示例:https://docs.puppet.com/puppet/4.10/lang_classes.html#appendix-smart-parameter-defaults

對於你的情況,類會是什麼樣子:

myclass($app_version = 'default version') { 
    if $app_version == '1.0' { 
    @package { 'unzip': ensure => '1xx' } 
    @package { 'fontconfig': ensure => '1-xx' } 
    @package { 'libfreetype': ensure => '6-1-xx' } 
    } 
    elsif $app_version == '2.0' { 
    @package { 'unzip': ensure => '2xx' } 
    @package { 'fontconfig': ensure => '2-xx' } 
    @package { 'libfreetype': ensure => '6-2-xx' } 
    } 
} 

從而也讓你保留你的虛擬資源。

然後,您可以通過聲明它傳遞參數給這個類,如:

class { 'myclass': app_version => '2.0' } 

或使用自動數據綁定與hieradata:

# puppet manifest 
include myclass 

# hieradata 
myclass::app_version: 2.0 

你收集,然後在其他地方將實現正確的版本,您可以包。