Відповіді:
Сьогодні я натрапив на подібний запит, але я не прихильник exec, якщо речі можна вирішити будь-якими іншими способами. Тому я вибрав інший шлях і написав простий спеціальний тип для "yumgroup". Просто помістіть ці файли в будь-який модуль вашого модульного шляху і все:
"ім'я модуля / lib / ляльковий / постачальник / yumgroup / default.rb"
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 / лялька / 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
Після цього запустіть ляльковий агент із увімкненою плагінсинхронізацією, і ви можете використовувати спеціальний тип, такий:
yumgroup {'Base': ensure => present, }
або:
yumgroup {'Development tools': ensure => absent, }
І ви можете побачити, які групи встановлюються, запустивши:
puppet resource yumgroup
насолоджуйтесь!
Ось визначення типу лялькового ресурсу 'yumgroup'. Він встановлює стандартні та обов'язкові пакети за замовчуванням і може встановлювати додаткові пакети.
Це визначення не може видалити yum групи, хоча це може бути нескладно. Я не турбував себе, тому що це може викликати петлі в ляльці за певних обставин.
Цей тип вимагає встановлення yum-downloadonly rpm, і я думаю, що він працює лише на RHEL / CentOS / SL 6. У той час, коли я це писав, статуси виходу yum у попередніх версіях були помилковими, тому параметр «якщо» не працював не поширюючись на греп для виводу.
define yumgroup($ensure = "present", $optional = false) {
case $ensure {
present,installed: {
$pkg_types_arg = $optional ? {
true => "--setopt=group_package_types=optional,default,mandatory",
default => ""
}
exec { "Installing $name yum group":
command => "yum -y groupinstall $pkg_types_arg $name",
unless => "yum -y groupinstall $pkg_types_arg $name --downloadonly",
timeout => 600,
}
}
}
}
Я навмисно опустив перетворення залежно від залежності, оскільки це може суперечити іншим проявам. Якщо ви хочете це зробити, оголосьте пакет yum-downloadonly в окремому маніфесті та включіть його в цей параметр. Не заявляйте безпосередньо в цьому визначенні, інакше маріонетка помилиться, якщо ви використовуєте цей тип ресурсу більше одного разу. Ресурс exec повинен вимагати Package ['yum-downloadonly'].
class yum_groupinstalls { yumgroup { '"Development tools"': } }
У визначенні я повинен був вказати повний шлях до yum, який для мене був / usr / bin / yum на CentOS 6.2.
Я не міг знайти нічого в ляльковому посилального типу для типу пакета, тому я запитав на каналі Ляльковий IRC на Freenode (#puppet, як не дивно) , і нічого не отримав , так що я думаю , що відповідь «ще не».
Ви можете впоратися з цим за допомогою типу Puppet Exec, щоб виконати необхідну установку групи. Я був би впевнений, щоб включити товар onlyif
або unless
варіант, щоб він виконував його лише при необхідності або встановлював refreshonly
і Notify
запускав його через так, щоб він не запускався кожен раз. Exec
Тип виконуватиме команду локально на ляльковий клієнта для вас , якщо вона спрацьовує.
Мені подобається рішення з користувацьким ресурсом, однак це не бездоганно. Моє перейняти існує? функція:
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
yum_content = yum('grouplist')
потрібно.split("\n")
так, щоб.each
не викликати помилок.