0

我不是真正的 puppet 专家,现在正在寻找一种“propper 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 的最佳方法是什么?

干杯并感谢您的想法,托马斯

4

1 回答 1

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

然后在您的清单中,您可以在 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 的 exec 运行“createrepo”并添加一个新的存储库,其 url 为“dir:///path/to/本地/rpms'

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

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

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

于 2015-10-21T16:34:41.190 回答