Puppet:“遍历”dir中的所有rpms并安装

时间:2015-10-20 14:45:09

标签: puppet hiera

我不是真正的傀儡专家,现在正在寻找一种安装一套本地RPM的'propper puppet'方式?

所以,我有一个本地目录,我在其中放置了一个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'walk'。但是因为我无论如何只有rpm-dir中的rpms,我想我真的不需要自己命名所有文件。 所以,我想知道在my_lib / {files} / rpmdir中复制和安装所有rpms的最佳方法是什么?

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

1 个答案:

答案 0 :(得分: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 servers目录中获取一系列文件:

$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上的文件名与包名完全匹配(文件名中没有版本或任何内容)。

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

更强大的解决方案是以递归方式将目录复制到代理程序(正如您所暗示的那样),并使用一个带有refreshonly的exec运行' createrepo'并添加一个新的存储库,其网址为' dir:/// path / to / local / rpms'

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

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

没有什么可以阻止你在puppetserver上托管文件并在端口80上向apache添加vhost。

相关问题