Puppet::Type.type(:yumgroup).provide(:default) do
desc 'Support for managing the yum groups'
commands :yum => '/usr/bin/yum'
# TODO
# find out how yum parses groups and reimplement that in ruby
def self.instances
groups = []
# get list of all groups
yum_content = yum('grouplist').split("\n")
# turn of collecting to avoid lines like 'Loaded plugins'
collect_groups = false
# loop through lines of yum output
yum_content.each do |line|
# if we get to 'Available Groups:' string, break the loop
break if line.chomp =~ /Available Groups:/
# collect groups
if collect_groups and line.chomp !~ /(Installed|Available)/
current_name = line.chomp.sub(/^\s+/,'\1').sub(/ \[.*\]/,'')
groups << new(
:name => current_name,
:ensure => :present
)
end
# turn on collecting when the 'Installed Groups:' is reached
collect_groups = true if line.chomp =~ /Installed Groups:/
end
groups
end
def self.prefetch(resources)
instances.each do |prov|
if resource = resources[prov.name]
resource.provider = prov
end
end
end
def create
yum('-y', 'groupinstall', @resource[:name])
@property_hash[:ensure] == :present
end
def destroy
yum('-y', 'groupremove', @resource[:name])
@property_hash[:ensure] == :absent
end
def exists?
@property_hash[:ensure] == :absent
end
end
“模块名/lib/puppet/type/yumgroup.rb”
Puppet::Type.newtype(:yumgroup) do
@doc = "Manage Yum groups
A typical rule will look like this:
yumgroup { 'Development tools':
ensure => present,
}
"
ensurable
newparam(:name) do
isnamevar
desc 'The name of the group'
end
end
您可以通过Puppet Exec Type处理此问题,以执行必要的组安装。我肯定会包含一个 good onlyiforunless选项,以便它只在需要时执行它,或者设置为refreshonly并通过 a 触发它,Notify这样它就不会每次都运行。该Exec类型将在 puppet 客户端上为您本地执行命令,前提是它被触发。
Puppet::Type.type(:yumgroup).provide(:default) do
desc 'Support for managing the yum groups'
commands :yum => '/usr/bin/yum'
# TODO
# find out how yum parses groups and reimplement that in ruby
def self.instances
groups = []
# get list of all groups
yum_content = yum('grouplist')
# turn of collecting to avoid lines like 'Loaded plugins'
collect_groups = false
# loop through lines of yum output
yum_content.each do |line|
# if we get to 'Available Groups:' string, break the loop
break if line.chomp =~ /Available Groups:/
# collect groups
if collect_groups and line.chomp !~ /(Installed|Available)/
current_name = line.chomp.sub(/^\s+/,'\1').sub(/ \[.*\]/,'')
groups << new(
:name => current_name,
:ensure => :present
)
end
# turn on collecting when the 'Installed Groups:' is reached
collect_groups = true if line.chomp =~ /Installed Groups:/
end
groups
end
def self.prefetch(resources)
instances.each do |prov|
if resource = resources[prov.name]
resource.provider = prov
end
end
end
def create
yum('-y', 'groupinstall', @resource[:name])
@property_hash[:ensure] == :present
end
def destroy
yum('-y', 'groupremove', @resource[:name])
@property_hash[:ensure] == :absent
end
def exists?
cmd = "/usr/bin/yum grouplist hidden \"" + @resource[:name] + "\" | /bin/grep \"^Installed\" > /dev/null"
system(cmd)
$?.success?
end
end
我今天遇到了类似的请求,但如果事情可以通过任何其他方式解决,我不喜欢执行官。所以我选择了一条不同的路径并为“yumgroup”编写了一个简单的自定义类型。只需将这些文件放在模块路径中的任何模块中即可:
“模块名/lib/puppet/provider/yumgroup/default.rb”
“模块名/lib/puppet/type/yumgroup.rb”
之后,在启用 pluginsync 的情况下运行 puppet 代理,您可以使用如下自定义类型:
或者:
您可以通过运行以下命令查看安装了哪些组:
请享用!
这是“yumgroup”傀儡资源类型的定义。它默认安装默认包和强制包,并且可以安装可选包。
这个定义还不能删除 yum 组,尽管它很容易实现。我没有为自己烦恼,因为在某些情况下它会导致 puppet 出现循环。
这种类型需要安装 yum-downloadonly rpm,我认为它只适用于 RHEL/CentOS/SL 6。在我写这篇文章的时候,yum 在以前版本上的退出状态是错误的,所以“除非”参数不起作用没有扩展到 grep 的输出。
我故意省略了使 yum-downloadonly 成为依赖项,因为它可能与其他人的清单冲突。如果您想这样做,请在单独的清单中声明 yum-downloadonly 包并将其包含在此定义中。不要在此定义中直接声明,否则如果您多次使用此资源类型,puppet 将出错。exec 资源应该需要 Package['yum-downloadonly']。
我在Puppet Type Reference中找不到Package 类型的任何内容,所以我在 Freenode 上的 Puppet IRC 频道上询问(#puppet,奇怪的是)并没有得到任何结果,所以我认为答案是“还没有”。
您可以通过Puppet Exec Type处理此问题,以执行必要的组安装。我肯定会包含一个 good
onlyif
orunless
选项,以便它只在需要时执行它,或者设置为refreshonly
并通过 a 触发它,Notify
这样它就不会每次都运行。该Exec
类型将在 puppet 客户端上为您本地执行命令,前提是它被触发。我喜欢带有自定义资源的解决方案,但它不是幂等的。我对存在的看法?功能: