我不是一个真正的木偶专家,现在正在寻找一个' proper puppet'的方式来安装一组本地rpm ?
所以,我有一个本地目录,我放了一些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}"],
}
}
现在我想"迭代"目录中的所有rpm,并一次复制/安装它们。我可以在hiera中定义所有文件,并使用create_resources"遍历"它们。但是,由于我的rpm-dir中只有rpm,所以我想我实际上不需要单独命名所有文件。所以,我想知道在my_lib/{files}/rpmdir中复制和安装所有rpm的最佳方法是什么?
谢谢你的想法。托马斯。
我以前也做过类似的事情。
您需要在服务器上编写解析器来定义一个新函数。类似于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
然后在你的清单中,你可以得到puppet服务器目录下的文件数组:
$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: }
然而,现实是,这是一个糟糕的解决方案。rpm可以被命名为任何东西。因此,您必须确保puppetserver上的文件名与包名完全匹配(文件名中没有版本或任何内容)。
它也不会解析任何依赖项。
一个更健壮的解决方案是递归地将目录复制到代理(如您所暗示的),并使用refreshonly命令运行'createrepo',并添加一个url为'dir:///path/to/local/rpms'的新存储库
然后你可以像平常一样安装包。
当然,最好的解决方案是将rpm添加到适当的存储库中。
没有什么可以阻止您在puppetserver上托管文件,并在端口80上向apache添加vhost。