Réponses:
J'ai rencontré une demande similaire aujourd'hui, mais je ne suis pas un fan d'un exécutif si les choses peuvent être résolues par d'autres moyens. J'ai donc choisi un chemin différent et écrit un type personnalisé simple pour 'yumgroup'. Mettez simplement ces fichiers dans n'importe quel module de votre module et c'est tout:
"modulename / 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
"modulename / 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
Et après cela, exécutez l'agent marionnette avec pluginsync activé, et vous pouvez utiliser un type personnalisé comme ceci:
yumgroup {'Base': ensure => present, }
ou:
yumgroup {'Development tools': ensure => absent, }
Et vous pouvez voir quels groupes sont installés en exécutant:
puppet resource yumgroup
prendre plaisir!
Voici une définition d'un type de ressource de marionnette «yumgroup». Il installe les packages par défaut et obligatoires par défaut et peut installer des packages facultatifs.
Cette définition ne peut pas encore supprimer les groupes miam bien qu'elle soit facile à réaliser. Je n'ai pas pris la peine pour moi car cela peut provoquer des boucles dans la marionnette dans certaines circonstances.
Ce type nécessite l'installation du rpm yum-downloadonly et je pense que cela ne fonctionne que sur RHEL / CentOS / SL 6. Au moment où j'ai écrit ceci, les états de sortie de yum sur les versions précédentes étaient erronés, donc le paramètre «à moins» ne fonctionnerait pas sans être étendu à grep pour la sortie.
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,
}
}
}
}
J'ai délibérément omis de faire de yum-downloadonly une dépendance car cela pourrait entrer en conflit avec les manifestes des autres. Si vous voulez faire cela, déclarez le package yum-downloadonly dans un manifeste séparé et incluez-le dans cette définition. Ne déclarez pas directement dans cette définition sinon marionnette donnera une erreur si vous utilisez ce type de ressource plus d'une fois. La ressource exec devrait alors nécessiter le package ['yum-downloadonly'].
class yum_groupinstalls { yumgroup { '"Development tools"': } }
dans la définition, je devais spécifier le chemin complet vers yum qui était / usr / bin / yum pour moi sur CentOS 6.2.
Je n'ai rien trouvé dans la référence de type de marionnette pour le type de package, j'ai donc demandé sur le canal IRC de marionnettes sur Freenode (# marionnette, bizarrement) et je n'ai rien obtenu, donc je pense que la réponse est "pas encore".
Vous pouvez gérer cela via un type Puppet Exec pour exécuter l'installation de groupe nécessaire. Je serais sûr d'inclure un bon onlyif
ou une unless
option pour qu'il ne l'exécute que lorsque cela est nécessaire ou défini sur refreshonly
et le déclenche via un Notify
afin qu'il ne soit pas exécuté à chaque fois. Le Exec
type exécutera la commande localement sur le client marionnette pour vous à condition qu'elle soit déclenchée.
J'aime la solution avec une ressource personnalisée mais elle n'est pas idempotente. Ma vision de l'existant? fonction:
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')
besoin d'un.split("\n")
pour que le.each
ne provoque pas d'erreurs.