Ответы:
Я сталкивался с подобной просьбой сегодня, но я не фанат исполнительного директора, если все можно решить любым другим способом. Поэтому я выбрал другой путь и написал простой пользовательский тип для «yumgroup». Просто поместите эти файлы в любой модуль в вашем модуле path и все:
"Имя_модуля / Библиотека / кукольный / поставщик / 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
"Имя_модуля / Библиотека / кукольный / тип / 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 с включенной функцией pluginsync, и вы можете использовать пользовательский тип, например так:
yumgroup {'Base': ensure => present, }
или:
yumgroup {'Development tools': ensure => absent, }
И вы можете увидеть, какие группы установлены, запустив:
puppet resource yumgroup
наслаждаться!
Вот определение типа ресурса марионетки yumgroup. Он устанавливает стандартные и обязательные пакеты по умолчанию и может устанавливать дополнительные пакеты.
Это определение еще не может удалить группы yum, хотя его легко реализовать. Я не беспокоился о себе, потому что это может вызвать петли в марионетке при определенных обстоятельствах.
Для этого типа требуется установить rum yum-downloadonly rpm, и я думаю, что он работает только на RHEL / CentOS / SL 6. В то время, когда я писал это, состояния выхода yum в предыдущих версиях были неправильными, поэтому параметр «never» не работал без расширения на grep для вывода.
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, поскольку это может противоречить манифестам других. Если вы хотите сделать это, объявите пакет yum-downloadonly в отдельном манифесте и включите его в это определение. Не указывайте прямо в этом определении, иначе Puppet выдаст ошибку, если вы используете этот тип ресурса более одного раза. Ресурсу exec затем потребуется пакет ['yum-downloadonly'].
class yum_groupinstalls { yumgroup { '"Development tools"': } }
в определении я должен был указать полный путь к yum, который для меня был / usr / bin / yum в CentOS 6.2.
Я не смог найти ничего в справочнике типов Puppet для типа Package, поэтому я спросил на IRC-канале Puppet на Freenode (#puppet, как ни странно) и ничего не получил, поэтому я думаю, что ответ «еще нет».
Вы можете обработать это с помощью Puppet Exec Type, чтобы выполнить необходимую групповую установку. Я бы обязательно включил товар 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
не вызывать ошибок.