Bagaimana cara menginstal grup paket yum dengan boneka?

10

Apakah boneka punya cara untuk menginstal grup paket yum (mis. 'Alat Pengembangan'), selain exec?

joeforker
sumber

Jawaban:

11

Saya telah menemukan permintaan serupa hari ini, tapi saya bukan penggemar eksekutif jika semuanya dapat diselesaikan dengan cara lain. Jadi saya telah memilih jalur yang berbeda dan menulis jenis kustom sederhana untuk 'yumgroup'. Cukup letakkan file-file ini di modul apa saja di modulepath Anda dan hanya itu:

"modulename / lib / boneka / 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

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

Dan setelah itu, jalankan agen boneka dengan pluginsync diaktifkan, dan Anda dapat menggunakan tipe khusus seperti ini:

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

atau:

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

Dan Anda dapat melihat grup apa yang diinstal dengan menjalankan:

puppet resource yumgroup

Nikmati!

Jakov Sosic
sumber
Saya pikir itu yum_content = yum('grouplist')perlu .split("\n")agar .eachtidak menyebabkan kesalahan.
alex.pilon
@ alex.pilon terima kasih atas tipnya. Itu bekerja seperti ini di v3.
Jakov Sosic
4

Berikut adalah definisi dari jenis sumber daya boneka 'yumgroup'. Ini menginstal paket default dan wajib secara default, dan dapat menginstal paket opsional.

Definisi ini tidak dapat menghapus grup yum, meskipun itu mudah untuk mewujudkannya. Saya tidak repot-repot untuk diri saya sendiri karena dapat menyebabkan loop pada boneka dalam keadaan tertentu.

Jenis ini mengharuskan rpm yum-download hanya diinstal dan saya pikir itu hanya bekerja pada RHEL / CentOS / SL 6. Pada saat saya menulis ini, status keluar yum pada versi sebelumnya salah sehingga parameter 'kecuali' tidak berfungsi tanpa diperpanjang untuk menerima 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,
         }
      }
   }
}

Saya sengaja menghilangkan membuat unduhan yum hanya ketergantungan karena mungkin bertentangan dengan manifes orang lain. Jika Anda ingin melakukan ini, nyatakan paket yum-download hanya dalam manifes terpisah dan sertakan yang ada di dalam definisi ini. Jangan mendeklarasikan secara langsung dalam definisi ini karena boneka akan memberikan kesalahan jika Anda menggunakan jenis sumber daya ini lebih dari sekali. Sumber daya exec kemudian harus membutuhkan Paket ['yum-download hanya'].

Chris Jenkins
sumber
Terima kasih untuk ini! Saya membuat modul bernama yum_groupinstalls dan membuat manifes init.pp dengan definisi Anda dan kelas untuk menginstal grup Alat pengembangan. Perhatikan bahwa saya harus mengutip nama grup: class yum_groupinstalls { yumgroup { '"Development tools"': } } Dalam definisi saya harus menentukan path lengkap ke yum yang merupakan / usr / bin / yum untuk saya di CentOS 6.2.
Banjer
3

Saya tidak dapat menemukan apa pun di Referensi Jenis Wayang untuk jenis Paket, jadi saya bertanya pada saluran IRC Wayang di Freenode (#puppet, anehnya) dan tidak mendapatkan apa-apa jadi saya pikir jawabannya "belum".

Cawflands
sumber
3

Anda dapat menangani ini melalui Jenis Puppet Exec untuk menjalankan instalasi kelompok yang diperlukan. Saya pasti akan menyertakan barang onlyifatau unlessopsi sehingga hanya mengeksekusi ketika dibutuhkan atau diatur ke refreshonlydan memicu melalui Notifysehingga tidak dijalankan setiap waktu sekalipun. The Execjenis akan mengeksekusi perintah secara lokal pada klien boneka Anda berikan itu dipicu.

Jeremy Bouse
sumber
1

Saya suka solusi dengan sumber daya kustom namun tidak idempoten. Pandangan saya tentang ada? fungsi:

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
sumber