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


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ę!


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”].


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”.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.