Wie installiere ich eine Yum-Paketgruppe mit Puppe?

10

Hat Puppet neben exec eine Möglichkeit, eine yum-Paketgruppe (z. B. 'Development Tools') zu installieren?

Joeforker
quelle

Antworten:

11

Ich bin heute auf eine ähnliche Anfrage gestoßen, aber ich bin kein Fan eines Geschäftsführers, wenn die Dinge auf andere Weise gelöst werden können. Also habe ich einen anderen Pfad gewählt und einen einfachen benutzerdefinierten Typ für 'yumgroup' geschrieben. Legen Sie diese Dateien einfach in ein beliebiges Modul in Ihrem Modulpfad und fertig:

"Modulname / 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

"Modulname / 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

Führen Sie anschließend den Puppet Agent mit aktiviertem Pluginsync aus, und Sie können einen benutzerdefinierten Typ wie den folgenden verwenden:

yumgroup {'Base': ensure => present, }

oder:

yumgroup {'Development tools': ensure => absent, }

Und Sie können sehen, welche Gruppen installiert sind, indem Sie Folgendes ausführen:

puppet resource yumgroup

genießen!

Jakov Sosic
quelle
Ich denke das yum_content = yum('grouplist')braucht ein .split("\n")damit das .eachkeine fehler verursacht.
Alex.pilon
@ alex.pilon danke für den Tipp. In Version 3 hat es allerdings so funktioniert.
Jakov Sosic
4

Hier ist eine Definition eines Puppenressourcentyps "yumgroup". Es installiert standardmäßig Standard- und Pflichtpakete und kann optionale Pakete installieren.

Diese Definition kann Yum-Gruppen noch nicht entfernen, obwohl es einfach wäre, dies zu erreichen. Ich habe mich nicht darum gekümmert, weil es unter bestimmten Umständen zu Schleifen in der Puppe kommen kann.

Für diesen Typ muss die Drehzahl "yum-downloadonly rpm" installiert sein, und ich denke, dass dies nur unter RHEL / CentOS / SL 6 funktioniert. Zum Zeitpunkt des Schreibens waren die Exit-Status von yum in früheren Versionen falsch, sodass der Parameter "es sei denn" nicht funktioniert ohne auf grep für die Ausgabe erweitert zu werden.

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,
         }
      }
   }
}

Ich habe bewusst darauf verzichtet, yum-downloadonly zu einer Abhängigkeit zu machen, da dies zu Konflikten mit den Manifesten anderer führen könnte. Wenn Sie dies tun möchten, deklarieren Sie das Paket yum-downloadonly in einem separaten Manifest und fügen Sie dieses in diese Definition ein. Deklarieren Sie nicht direkt in dieser Definition, da sonst die Puppe einen Fehler ausgibt, wenn Sie diesen Ressourcentyp mehrmals verwenden. Die Exec-Ressource sollte dann das Paket ['yum-downloadonly'] benötigen.

Chris Jenkins
quelle
Danke dafür! Ich habe ein Modul namens yum_groupinstalls erstellt und ein init.pp-Manifest mit Ihrer Definition und einer Klasse erstellt, um die Gruppe Entwicklungstools zu installieren. Beachten Sie, dass ich den Gruppennamen class yum_groupinstalls { yumgroup { '"Development tools"': } } angeben musste : In der Definition musste ich den vollständigen Pfad zu yum angeben, der unter CentOS 6.2 für mich / usr / bin / yum war.
Banjer
3

Ich konnte in der Puppet Type Reference für den Package Type nichts finden , also fragte ich im Puppet IRC-Kanal auf Freenode (#puppet, seltsamerweise) und bekam nichts, daher denke ich, dass die Antwort "noch nicht" ist.

Cawflands
quelle
3

Sie können dies über einen Puppet Exec-Typ erledigen , um die erforderliche Gruppeninstallation auszuführen. Ich würde sicher ein Gut onlyifoder eine unlessOption einschließen, damit es nur bei Bedarf ausgeführt oder auf gesetzt refreshonlyund über a ausgelöst wird, Notifydamit es nicht jedes Mal ausgeführt wird. Der ExecTyp führt den Befehl lokal auf dem Puppet-Client für Sie aus, sofern er ausgelöst wird.

Jeremy Bouse
quelle
1

Ich mag die Lösung mit einer benutzerdefinierten Ressource, aber sie ist nicht idempotent. Meine Einstellung zum existiert? Funktion:

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
quelle