Comment installer un groupe de packages yum avec marionnette?

10

La marionnette a-t-elle un moyen d'installer un groupe de paquets yum (par exemple «Outils de développement»), en plus de exec?

joeforker
la source

Réponses:

11

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!

Jakov Sosic
la source
Je pense que cela a yum_content = yum('grouplist')besoin d'un .split("\n")pour que le .eachne provoque pas d'erreurs.
alex.pilon
@ alex.pilon merci pour l'astuce. Cela fonctionnait comme ça dans la v3.
Jakov Sosic
4

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'].

Chris Jenkins
la source
Merci pour cela! J'ai créé un module appelé yum_groupinstalls et créé un manifeste init.pp avec votre définition et une classe pour installer le groupe d'outils de développement. Notez que je devais citer le nom du groupe: 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.
Banjer
3

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".

Cawflands
la source
3

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 onlyifou une unlessoption pour qu'il ne l'exécute que lorsque cela est nécessaire ou défini sur refreshonlyet le déclenche via un Notifyafin qu'il ne soit pas exécuté à chaque fois. Le Exectype exécutera la commande localement sur le client marionnette pour vous à condition qu'elle soit déclenchée.

Jeremy Bouse
la source
1

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
Michal Wasilewski
la source