Puppet 傀儡:“;迭代;在dir和install中的所有RPM上

Puppet 傀儡:“;迭代;在dir和install中的所有RPM上,puppet,hiera,Puppet,Hiera,我不是一个真正的木偶专家,现在正在寻找一种“支撑木偶”的方式来安装一套本地RPM 因此,我有一个本地目录,我在其中放置了一些rpm,我希望安装它们-因此我定义了一个资源来复制rpm文件并安装它 define package_local( $source = $name, $rpmdirpuppet = "puppet:///modules/my_lib/rpmdir", $rpmdirlocal = "/var/package/" ) { file{"${rpmdirlocal}": pat

我不是一个真正的木偶专家,现在正在寻找一种“支撑木偶”的方式来安装一套本地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}"],
    }
}
现在我想“迭代”DirExtry中的所有RPM,并一次性复制/安装它们。我可以在hiera中定义所有文件,并通过create_资源“漫游”。但是,因为我的rpm目录中只有rpm,我想我并不真的需要自己命名所有文件。 因此,我想知道什么是复制和安装我的_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 servers目录中获得一组文件,其中包括:

$module_path=get_module_path(${caller_module_name})
$rpms=get_files("${module_path}/files")
接下来,您需要一个定义的类型或进行迭代。(以下内容是徒手编写的,可以编译,也可以不编译)

然后进行安装:

localrpm{$rpms: }
然而,现实是,这是一个糟糕的解决方案。 RPM可以命名为任何名称。因此,您必须确保puppetserver上的文件名与包名完全匹配(文件名中没有版本或任何内容)

它也不会解决任何依赖关系

一个更健壮的解决方案是递归地将目录复制到代理(正如您所暗示的),并让一个运行“createrepo”的带有refreshonly的exec添加一个url为的新存储库dir:///path/to/local/rpms"

然后您就可以正常安装软件包了

当然,最好的解决方案是将RPM添加到适当的存储库中


没有什么能阻止您在puppetserver上托管文件,并在端口80上向apache添加vhost。

事实上,现在想想,我本可以递归复制rpmdir,但是我仍然需要在本地迭代RPM?非常感谢详细的解决方案!经过几个小时的苦苦挣扎之后,我现在实际上是在寻找我自己的小型存储库,这可能更容易设置和维护…:-/
localrpm{$rpms: }