Як встановити групу пакетів yum з лялькою?


10

Чи має ляльковий спосіб встановити групу пакетів yum (наприклад, "Інструменти розробки"), крім exec?

Відповіді:


11

Сьогодні я натрапив на подібний запит, але я не прихильник exec, якщо речі можна вирішити будь-якими іншими способами. Тому я вибрав інший шлях і написав простий спеціальний тип для "yumgroup". Просто помістіть ці файли в будь-який модуль вашого модульного шляху і все:

"ім'я модуля / lib / ляльковий / постачальник / 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

"ім'я модуля / lib / лялька / 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

Після цього запустіть ляльковий агент із увімкненою плагінсинхронізацією, і ви можете використовувати спеціальний тип, такий:

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

або:

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

І ви можете побачити, які групи встановлюються, запустивши:

puppet resource yumgroup

насолоджуйтесь!


Я думаю, що yum_content = yum('grouplist')потрібно .split("\n")так, щоб .eachне викликати помилок.
alex.pilon

@ alex.pilon дякую за пораду. Це працювало так у v3, хоча.
Jakov Sosic

4

Ось визначення типу лялькового ресурсу 'yumgroup'. Він встановлює стандартні та обов'язкові пакети за замовчуванням і може встановлювати додаткові пакети.

Це визначення не може видалити yum групи, хоча це може бути нескладно. Я не турбував себе, тому що це може викликати петлі в ляльці за певних обставин.

Цей тип вимагає встановлення yum-downloadonly rpm, і я думаю, що він працює лише на RHEL / CentOS / SL 6. У той час, коли я це писав, статуси виходу yum у попередніх версіях були помилковими, тому параметр «якщо» не працював не поширюючись на греп для виводу.

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

Я навмисно опустив перетворення залежно від залежності, оскільки це може суперечити іншим проявам. Якщо ви хочете це зробити, оголосьте пакет yum-downloadonly в окремому маніфесті та включіть його в цей параметр. Не заявляйте безпосередньо в цьому визначенні, інакше маріонетка помилиться, якщо ви використовуєте цей тип ресурсу більше одного разу. Ресурс exec повинен вимагати Package ['yum-downloadonly'].


Дякую за це! Я створив модуль під назвою yum_groupinstalls та створив маніфест init.pp із вашим визначенням та класом для встановлення групи інструментів розвитку. Зауважте, що мені довелося навести ім'я групи: class yum_groupinstalls { yumgroup { '"Development tools"': } } У визначенні я повинен був вказати повний шлях до yum, який для мене був / usr / bin / yum на CentOS 6.2.
Банджер


3

Ви можете впоратися з цим за допомогою типу Puppet Exec, щоб виконати необхідну установку групи. Я був би впевнений, щоб включити товар onlyifабо unlessваріант, щоб він виконував його лише при необхідності або встановлював refreshonlyі Notifyзапускав його через так, щоб він не запускався кожен раз. ExecТип виконуватиме команду локально на ляльковий клієнта для вас , якщо вона спрацьовує.


1

Мені подобається рішення з користувацьким ресурсом, однак це не бездоганно. Моє перейняти існує? функція:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.