¿Cómo instalo un grupo de paquetes yum con puppet?

10

¿Puppet tiene una forma de instalar un grupo de paquetes yum (por ejemplo, 'Herramientas de desarrollo'), además de exec?

joeforker
fuente

Respuestas:

11

Me he encontrado con una solicitud similar hoy, pero no soy fanático de un ejecutivo si las cosas se pueden resolver por cualquier otro medio. Así que elegí una ruta diferente y escribí un tipo personalizado simple para 'yumgroup'. Simplemente coloque estos archivos en cualquier módulo en su ruta de módulo y listo:

"nombre de módulo / 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

"nombre de módulo / 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

Y después de eso, ejecute Puppet Agent con pluginsync habilitado, y puede usar un tipo personalizado como este:

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

o:

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

Y puede ver qué grupos se instalan ejecutando:

puppet resource yumgroup

¡disfrutar!

Jakov Sosic
fuente
Creo que yum_content = yum('grouplist')necesita un .split("\n")para que .eachno cause errores.
alex.pilon
@ alex.pilon gracias por el consejo. Sin embargo, funcionaba así en v3.
Jakov Sosic
4

Aquí hay una definición de un tipo de recurso títere 'yumgroup'. Instala paquetes predeterminados y obligatorios de forma predeterminada, y puede instalar paquetes opcionales.

Esta definición aún no puede eliminar los grupos yum, aunque sería fácil hacerlo realidad. No me molesté por mí mismo porque puede causar bucles en títeres bajo ciertas circunstancias.

Este tipo requiere la instalación de yum-downloadonly rpm y creo que solo funciona en RHEL / CentOS / SL 6. En el momento en que escribí esto, los estados de salida de yum en versiones anteriores eran incorrectos, por lo que el parámetro 'a menos' no funcionaría sin extenderse a grep para salida.

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

He omitido deliberadamente hacer de yum-downloadonly una dependencia, ya que podría entrar en conflicto con los manifiestos de otros. Si desea hacer esto, declare el paquete yum-downloadonly en un manifiesto separado e inclúyalo dentro de esta definición. No declare directamente en esta definición, de lo contrario, Puppet dará un error si utiliza este tipo de recurso más de una vez. El recurso ejecutivo debería requerir el paquete ['yum-downloadonly'].

Chris Jenkins
fuente
¡Gracias por esto! Creé un módulo llamado yum_groupinstalls y creé un manifiesto init.pp con su definición y una clase para instalar el grupo de Herramientas de desarrollo. Tenga en cuenta que tuve que citar el nombre del grupo: class yum_groupinstalls { yumgroup { '"Development tools"': } } en la definición tuve que especificar la ruta completa a yum que era / usr / bin / yum para mí en CentOS 6.2.
Banjer
3

No pude encontrar nada en la Referencia de tipo de títere para el tipo de paquete, así que pregunté en el canal IRC de títeres en Freenode (#puppet, curiosamente) y no obtuve nada, así que creo que la respuesta es "todavía no".

Cawflands
fuente
3

Puede manejar esto a través de un Tipo de ejecución de Puppet para ejecutar la instalación de grupo necesaria. Me aseguraría de incluir un bien onlyifu unlessopción para que solo lo ejecute cuando sea necesario o configurado refreshonlyy lo active a través de un Notifymodo para que no se ejecute todo el tiempo. El Exectipo ejecutará el comando localmente en el cliente de títeres para usted siempre que se active.

Jeremy Bouse
fuente
1

Me gusta la solución con un recurso personalizado, sin embargo, no es idempotente. Mi opinión sobre el existe? función:

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
fuente