Я ничего не мог найти в Марионеточной Ссылке Типа для типа Пакета, таким образом, я спросил относительно Марионетки канал IRC на Freenode (#puppet, странно) и ничего не получил так, что я думаю, что ответ "еще" не.
Вы могли обработать это через Марионеточный Исполнительный Тип для выполнения необходимой установки группы. Я, несомненно, включал бы пользу onlyif
или unless
опция так, чтобы это только выполнило его, при необходимости или установлено на refreshonly
и инициируйте его через a Notify
так, чтобы это не было выполнено каждый раз все же. Exec
тип выполнит команду локально на марионеточном клиенте для Вас, если это инициировано.
Вот определение типа ресурса марионетки «yumgroup». По умолчанию он устанавливает пакеты по умолчанию и обязательные пакеты, а также может устанавливать дополнительные пакеты.
Это определение пока не может удалить группы yum, хотя это было бы легко сделать. Я не беспокоился о себе, потому что при определенных обстоятельствах это может вызвать циклы в марионетке.
Для этого типа требуется установка yum-downloadonly rpm, и я думаю, что он работает только на RHEL / CentOS / SL 6. В то время я написал это, статусы выхода yum в предыдущих версиях были неправильными, поэтому параметр 'if' не работал бы без расширения до 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 в отдельном манифесте и включить его в это определение. Не объявляйте напрямую в этом определении, иначе марионетка выдаст ошибку, если вы используете этот тип ресурса более одного раза. Ресурсу exec затем потребуется Package ['yum-downloadonly'].
Сегодня я столкнулся с подобным запросом, но я не поклонник исполнительного директора, если проблемы можно решить другими способами. Итак, я выбрал другой путь и написал простой пользовательский тип для yumgroup. Просто поместите эти файлы в любой модуль в пути к модулю, и все:
"имя модуля / lib / puppet / provider / 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 / 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
И после этого запустите агент марионеток с включенным pluginsync, и вы можете использовать собственный тип, например:
yumgroup {'Base': ensure => present, }
или:
yumgroup {'Development tools': ensure => absent, }
И вы можете увидеть, какие группы установлены, запустив:
puppet resource yumgroup
наслаждайтесь!
Мне нравится решение с настраиваемым ресурсом, но оно не идемпотентное. Мой взгляд на сущее? функция:
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