2015-10-20 29 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