Jak zainstalować grupę pakietów yum z marionetką?

10

Czy lalek ma sposób na zainstalowanie grupy pakietów yum (np. „Narzędzia programistyczne”) oprócz exec?

współpracownik
źródło

Odpowiedzi:

11

Dzisiaj spotkałem się z podobną prośbą, ale nie jestem fanem egzekucji, jeśli sprawy można rozwiązać w inny sposób. Więc wybrałem inną ścieżkę i napisałem prosty niestandardowy typ dla „yumgroup”. Wystarczy umieścić te pliki w dowolnym module na ścieżce modułów i to wszystko:

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

„nazwa modułu / 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

Następnie uruchom agenta marionetkowego z włączoną funkcją pluginsync i możesz użyć niestandardowego typu:

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

lub:

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

I możesz zobaczyć, jakie grupy są instalowane, uruchamiając:

puppet resource yumgroup

cieszyć się!

Jakov Sosic
źródło
Myślę, że to yum_content = yum('grouplist')wymaga, .split("\n")aby .eachnie powodować błędów.
alex.pilon
@ alex.pilon dzięki za wskazówkę. Tak jednak działało w v3.
Jakov Sosic
4

Oto definicja typu zasobu kukiełkowego „yumgroup”. Domyślnie instaluje pakiety domyślne i obowiązkowe i może instalować pakiety opcjonalne.

Ta definicja nie może jeszcze usunąć grup mniam, chociaż byłoby to łatwe. Nie zawracałem sobie głowy, ponieważ w pewnych okolicznościach może powodować pętle w marionetce.

Ten typ wymaga zainstalowania yum-downloadonly rpm i myślę, że działa tylko na RHEL / CentOS / SL 6. W chwili, gdy to pisałem, statusy wyjścia yum w poprzednich wersjach były nieprawidłowe, więc parametr „chyba” nie działał bez rozszerzania na grep dla wyjścia.

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

Celowo pominąłem uczynienie mniam pobrania tylko zależnością, ponieważ może ona kolidować z manifestami innych. Jeśli chcesz to zrobić, zadeklaruj pakiet do pobrania tylko w osobnym pliku manifestu i dołącz go do tej definicji. Nie deklaruj bezpośrednio w tym określeniu, w przeciwnym razie marionetka spowoduje błąd, jeśli użyjesz tego typu zasobów więcej niż raz. Zasób exec powinien następnie wymagać pakietu [„yum-downloadonly”].

Chris Jenkins
źródło
Dzięki za to! Stworzyłem moduł o nazwie yum_groupinstalls i utworzyłem manifest init.pp z twoją definicją i klasą do zainstalowania grupy narzędzi programistycznych. Zauważ, że musiałem zacytować nazwę grupy: class yum_groupinstalls { yumgroup { '"Development tools"': } } W definicji musiałem podać pełną ścieżkę do yum, która była dla mnie / usr / bin / yum w CentOS 6.2.
Banjer
3

Nie mogłem znaleźć niczego w Puppet Type Reference dla typu Package, więc zapytałem na kanale IRC Puppet na Freenode (dziwnie #puppet) i nic nie dostałem, więc myślę, że odpowiedź brzmi „jeszcze nie”.

Cawflands
źródło
3

Możesz sobie z tym poradzić poprzez Puppet Exec Type, aby przeprowadzić niezbędną instalację grupową. Z pewnością dodam dobro onlyiflub unlessopcję, aby uruchamiała je tylko w razie potrzeby lub ustawiała refreshonlyi uruchamiała za pomocą Notifytak, aby nie była uruchamiana za każdym razem. ExecTyp wykona polecenie lokalnie na kliencie dla lalek, który podałeś jest wyzwalany.

Jeremy Bouse
źródło
1

Podoba mi się rozwiązanie z niestandardowym zasobem, ale nie jest idempotentne. Moje podejście do istnienia istnieje? funkcjonować:

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
Michał Wasilewski
źródło