Как мне установить группу пакетов yum с puppet?

10

Есть ли у puppet способ установить группу пакетов yum (например, «Инструменты разработки»), кроме exec?

joeforker
источник

Ответы:

11

Я сталкивался с подобной просьбой сегодня, но я не фанат исполнительного директора, если все можно решить любым другим способом. Поэтому я выбрал другой путь и написал простой пользовательский тип для «yumgroup». Просто поместите эти файлы в любой модуль в вашем модуле path и все:

"Имя_модуля / Библиотека / кукольный / поставщик / 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

"Имя_модуля / Библиотека / кукольный / тип / 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

И после этого запустите агент puppet с включенной функцией pluginsync, и вы можете использовать пользовательский тип, например так:

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

или:

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

И вы можете увидеть, какие группы установлены, запустив:

puppet resource yumgroup

наслаждаться!

Яков Сосич
источник
Я думаю, что это yum_content = yum('grouplist')нужно, .split("\n")чтобы .eachне вызывать ошибок.
alex.pilon
@ alex.pilon спасибо за совет. Это работало как это в v3 все же.
Яков Сосич
4

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

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

Для этого типа требуется установить rum yum-downloadonly rpm, и я думаю, что он работает только на RHEL / CentOS / SL 6. В то время, когда я писал это, состояния выхода yum в предыдущих версиях были неправильными, поэтому параметр «never» не работал без расширения на grep для вывода.

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, поскольку это может противоречить манифестам других. Если вы хотите сделать это, объявите пакет yum-downloadonly в отдельном манифесте и включите его в это определение. Не указывайте прямо в этом определении, иначе Puppet выдаст ошибку, если вы используете этот тип ресурса более одного раза. Ресурсу exec затем потребуется пакет ['yum-downloadonly'].

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

Я не смог найти ничего в справочнике типов Puppet для типа Package, поэтому я спросил на IRC-канале Puppet на Freenode (#puppet, как ни странно) и ничего не получил, поэтому я думаю, что ответ «еще нет».

Cawflands
источник
3

Вы можете обработать это с помощью Puppet Exec Type, чтобы выполнить необходимую групповую установку. Я бы обязательно включил товар 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
Михал Василевский
источник