2015-10-20 80 views
0

我不是一個真正的木偶專家,現在正在尋找一種「propper puppet」方式來安裝一組本地RPMs?木偶:「迭代」在目錄中的所有rpms並安裝

所以,我有我放哪兒了一些RPM包,我想獲得安裝在本地目錄中 - 因此,我定義的資源複製RPM文件並安裝它

define package_local(
$source = $name, 
$rpmdirpuppet = "puppet:///modules/my_lib/rpmdir", 
$rpmdirlocal = "/var/package/" 
) 
{ 
file{"${rpmdirlocal}": 
    path => $rpmdirlocal, 
    ensure => "directory", 
}-> 
    file {"${rpmdirlocal}/${source}": 
    source => "${rpmdirpuppet}/${source}", 
path => "${rpmdirlocal}/${source}", 
    }-> 
    package {"${rpmdirlocal}/${source}": 
    provider => "rpm", 
    source => "${rpmdirlocal}/${source}", 
    require => File["${rpmdirlocal}/${source}"], 
    } 
} 

現在我想對dirextory中的所有RPM進行「迭代」,並一次性複製/安裝它們。我可以在hiera中定義所有文件,並通過它們與create_resources'走'。但是因爲我反正只有rpm-dir中的RPM,我想我並不需要自己命名所有文件。 所以,我想知道什麼是最好的方式來獲取my_lib/{files}/rpmdir中所有rpms的複製和安裝?

乾杯,感謝您的想法, 托馬斯

+0

實際上,現在考慮這個問題,我可能只是複製rpmdir遞歸 - 但我仍然要在本地迭代rpms? – THX

回答

2

我已經做了,在過去類似的措施。

您需要在服務器上編寫解析器來定義新函數。像這樣的事情在modules/extras/lib/puppet/parser/functions/get_files.rb

module Puppet::Parser::Functions 
    newfunction(:get_files, :type => :rvalue) do |args| 
    raise ArgumentError, ("get_files(): wrong number of arguments (#{args.length}; must be path on master)") if args.length != 1 
    dir = args[0] 
    files = Dir.glob("#{dir}/**/*").select {|f| File.file? f}.map!{|f| f.sub!("#{dir}/","")} 
    p files 
    files 
    end 
end 

然後在你的清單,你可以得到文件的陣列上的傀儡服務器目錄中:

$module_path=get_module_path(${caller_module_name}) 
$rpms=get_files("${module_path}/files") 

下次你需要一個定義的類型或迭代。 (以下是寫意,可能會或可能不會進行編譯)

define localrpm (
    $rpm, 
    $localdir = '/tmp' 
) { 
    $package_name = regsubst($rpm,'.rpm$','') 
    file {"$localdir/$rpm": 
    ensure => file, 
    source => "puppet:///modules/${caller_module_name}/$rpm" 
    } -> 
    package {"$package_name": 
    ensure => installed, 
    provider => rpm, 
    source => "$localdir/$rpm" 
    } 

} 

然後你做的安裝:

localrpm{$rpms: } 

現實情況卻是,這吮吸作爲解決方案。rpms可以被命名爲任何東西。所以你必須確保puppetserver上的文件名與包名(沒有版本或文件名中的任何內容)完全匹配。

它也不會解決任何依賴關係。

一個更健壯的解決方案是遞歸地將目錄複製到代理(正如你暗示的),並且擁有一個運行'createrepo'的refreshon的exec並添加一個URL爲'dir:///路徑/到/本地/ rpms'

然後,您可以正常安裝軟件包。

當然,最好的解決方案是將rpms添加到正確的存儲庫。

沒有什麼能阻止你主持你的puppetserver文件並添加虛擬主機apache和80端口的

+0

非常感謝您的詳細解決方案! 經過幾個小時的努力,我現在正在爲自己的小存儲庫工作,這可能更容易設置和維護......: - / – THX