Como instalo um grupo de pacotes yum com fantoches?

10

O fantoche tem uma maneira de instalar um grupo de pacotes yum (por exemplo, 'Ferramentas de desenvolvimento'), além de exec?

    
por joeforker 29.03.2010 / 22:50

5 respostas

11

Eu me deparei com uma solicitação semelhante hoje, mas não sou fã de um executivo se as coisas puderem ser resolvidas de qualquer outra forma. Então escolhi um caminho diferente e escrevi um tipo personalizado simples para 'yumgroup'. Basta colocar esses arquivos em qualquer módulo no seu modulepath e pronto:

"nome do módulo / lib / fantoche / 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+/,'').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

"nome do módulo / lib / fantoche / 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

Depois disso, execute o agente de marionetes com o pluginsync ativado e você pode usar o tipo personalizado como este:

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

ou:

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

E você pode ver quais grupos são instalados executando:

puppet resource yumgroup

divirta-se!

    
por 21.11.2013 / 18:12
4

Aqui está uma definição de um tipo de recurso de fantoches 'yumgroup'. Ele instala pacotes padrão e obrigatórios por padrão e pode instalar pacotes opcionais.

Esta definição não pode remover grupos do yum, embora seja fácil fazer isso acontecer. Eu não me incomodei porque pode causar loops em marionetes sob certas circunstâncias.

Esse tipo requer que o yum-downloadonly rpm seja instalado e eu acho que ele só funciona no RHEL / CentOS / SL 6. Na época que escrevi isso, os status de saída do yum nas versões anteriores estavam errados, então o parâmetro 'unless' trabalhe sem ser estendido para grep para saída.

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

Eu omiti deliberadamente fazer do yum-downloadonly uma dependência, pois poderia entrar em conflito com os manifestos dos outros. Se você quiser fazer isso, declare o pacote yum-downloadonly em um manifesto separado e inclua-o dentro desta definição. Não declare diretamente nesta definição. Caso contrário, o fantoche apresentará um erro se você usar esse tipo de recurso mais de uma vez. O recurso exec deve então exigir o pacote ['yum-downloadonly'].

    
por 31.01.2012 / 06:40
3

Não encontrei nada na referência do tipo de fantoche para o tipo de pacote, por isso Eu perguntei no canal IRC Puppet no Freenode (#puppet, curiosamente) e não obtive nada, então acho que a resposta é "ainda não".

    
por 20.04.2010 / 19:34
3

Você pode lidar com isso por meio de um tipo de executor de fantoches para executar a instalação de grupo necessária. Eu certamente incluiria uma boa opção onlyif ou unless , de modo que ela só seja executada quando necessário ou definida como refreshonly e acionada por meio de Notify , para que não seja executada todas as vezes. O tipo Exec executará o comando localmente no cliente fantoche, desde que seja acionado.

    
por 18.06.2010 / 23:34
1

Eu gosto da solução com um recurso personalizado, mas não é idempotente. Minha opinião sobre o que existe? função:

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+/,'').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
    
por 16.05.2016 / 10:17