Como instalo um grupo de pacotes yum com fantoches?

10

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

joeforker
fonte

Respostas:

11

Encontrei um pedido semelhante hoje, mas não sou fã de um executivo se as coisas puderem ser resolvidas por qualquer outro meio. Então, eu escolhi um caminho diferente e escrevi um tipo personalizado simples para 'yumgroup'. Basta colocar esses arquivos em qualquer módulo no seu modulepath e é isso:

"nome do 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

"nome do 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

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

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

ou:

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

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

puppet resource yumgroup

desfrutar!

Jakov Sosic
fonte
Eu acho que yum_content = yum('grouplist')precisa de um .split("\n")para que o .eachnão cause erros.
precisa saber é o seguinte
@ alex.pilon obrigado pela dica. Mas estava funcionando assim na v3.
Jakov Sosic 08/07/19
4

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

Essa definição ainda não pode remover os grupos yum, embora seja fácil fazer isso acontecer. Eu não me incomodei por mim mesma, porque pode causar loops no boneco sob certas circunstâncias.

Esse tipo requer que o yum-downloadonly rpm esteja instalado e acho que só funciona no RHEL / CentOS / SL 6. No momento em que escrevi isso, os status de saída do yum nas versões anteriores estavam errados, portanto o parâmetro 'salvo' não funcionaria 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,
         }
      }
   }
}

Omiti deliberadamente tornar o yum-download apenas uma dependência, pois pode 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 nessa definição. Não declare diretamente nesta definição, caso contrário, o fantoche causará um erro se você usar esse tipo de recurso mais de uma vez. O recurso exec deve exigir o Package ['yum-downloadonly'].

Chris Jenkins
fonte
Obrigado por isso! Criei um módulo chamado yum_groupinstalls e criei um manifesto init.pp com sua definição e uma classe para instalar o grupo Ferramentas de Desenvolvimento. Observe que eu tive que citar o nome do grupo: class yum_groupinstalls { yumgroup { '"Development tools"': } } Na definição, eu tive que especificar o caminho completo para o yum que era / usr / bin / yum para mim no CentOS 6.2.
Banjer
3

Não encontrei nada na Referência de tipo de fantoche para o tipo de pacote, então perguntei no canal IRC do Puppet no Freenode (#puppet, estranhamente) e não consegui nada, então acho que a resposta "ainda não".

Cawflands
fonte
3

Você pode lidar com isso através de um Puppet Exec Type para executar a instalação de grupo necessária. Certifico-me de incluir um item onlyifou unlessopção para que ele só seja executado quando necessário ou definido como refreshonlye acionado por meio de um Notifymodo que não seja executado sempre. O Exectipo executará o comando localmente no cliente fantoche para você, desde que seja acionado.

Jeremy Bouse
fonte
1

Gosto da solução com um recurso personalizado, no entanto, não é idempotente. Minha opinião sobre o 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+/,'\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
fonte