Come installo un gruppo di pacchetti yum con Puppet?


Risposte:


11

Ho incontrato richieste simili oggi, ma non sono un fan di un dirigente se le cose possono essere risolte con qualsiasi altro mezzo. Quindi ho scelto un percorso diverso e ho scritto un semplice tipo personalizzato per 'yumgroup'. Inserisci questi file in qualsiasi modulo nel tuo modulepath e il gioco è fatto:

"Modulename / lib / burattino / fornitore / 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 / burattino / tipo / 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

E dopo, esegui il burattinaio con pluginsync abilitato e puoi usare un tipo personalizzato come questo:

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

o:

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

E puoi vedere quali gruppi sono installati eseguendo:

puppet resource yumgroup

godere!


Penso che abbia yum_content = yum('grouplist')bisogno di un .split("\n")modo che .eachnon causi errori.
alex.pilon,

@ alex.pilon grazie per il suggerimento. Funzionava così in v3 però.
Jakov Sosic,

4

Ecco una definizione di un tipo di risorsa fantoccio "yumgroup". Installa i pacchetti predefiniti e obbligatori per impostazione predefinita e può installare pacchetti opzionali.

Questa definizione non è ancora in grado di rimuovere i gruppi di yum sebbene sia comunque facile farlo accadere. Non mi sono preoccupato per me stesso perché in determinate circostanze può causare anelli nel burattino.

Questo tipo richiede l'installazione di yum-downloadonly rpm e penso che funzioni solo su RHEL / CentOS / SL 6. Al momento in cui ho scritto questo, gli stati di uscita di yum nelle versioni precedenti erano errati, quindi il parametro 'a meno' non funzionava senza essere esteso a grep per l'output.

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

Ho deliberatamente omesso di fare di yum-downloadonly una dipendenza in quanto potrebbe essere in conflitto con i manifest di altri. Se vuoi farlo, dichiara il pacchetto yum-downloadonly in un manifest separato e includilo all'interno di questa definizione. Non dichiarare direttamente in questa definizione, altrimenti il ​​pupazzo genererà un errore se si utilizza questo tipo di risorsa più di una volta. La risorsa exec dovrebbe quindi richiedere il pacchetto ['yum-downloadonly'].


Grazie per questo! Ho creato un modulo chiamato yum_groupinstalls e ho creato un manifest init.pp con la tua definizione e una classe per installare il gruppo Strumenti di sviluppo. Nota che ho dovuto citare il nome del gruppo: class yum_groupinstalls { yumgroup { '"Development tools"': } } nella definizione ho dovuto specificare il percorso completo di yum che era / usr / bin / yum per me su CentOS 6.2.
Banjer,

3

Non sono riuscito a trovare nulla nel riferimento al tipo di pupazzo per il tipo di pacchetto, quindi ho chiesto sul canale IRC del burattino su Freenode (#puppet, stranamente) e non ho ottenuto nulla, quindi penso che la risposta sia "non ancora".


3

Puoi gestirlo tramite un Puppet Exec Type per eseguire l'installazione del gruppo necessaria. Sarei sicuro di includere un bene onlyifo unlessun'opzione in modo che lo esegua solo quando necessario o impostato su refreshonlye attivarlo tramite un Notifymodo che non venga eseguito ogni volta. Il Exectipo eseguirà il comando localmente sul client fantoccio per te a condizione che sia attivato.


1

Mi piace la soluzione con una risorsa personalizzata, tuttavia non è idempotente. La mia opinione sull'esistente? funzione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.