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


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


10
2018-03-29 20:50


Источник




Ответы:


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

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

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

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

или:

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

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

puppet resource yumgroup

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


11
2017-11-21 17:12



я думаю что yum_content = yum('grouplist') нуждается в .split("\n") таким образом .each не вызывает ошибок. - alex.pilon
@ alex.pilon спасибо за подсказку. В то же время он работал так же в версии 3. - Jakov Sosic


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

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

Этот тип требует установки yum-downloadonly rpm, и я думаю, что он работает только на RHEL / CentOS / SL 6. В то время, когда я писал об этом, статусы выхода yum на предыдущих версиях были неправильными, поэтому параметр «если» не будет работать без расширения до 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 в отдельном манифесте и включите его в это определение. Не объявляйте прямо в этом определении, иначе марионетка даст ошибку, если вы используете этот тип ресурса более одного раза. Затем ресурс exec должен потребовать Package ['yum-downloadonly'].


4
2018-01-31 05:40



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


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


3
2018-04-20 17:34





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


3
2018-06-18 21:34





Мне нравится решение с пользовательским ресурсом, но это не идемпотент. Мое занятие существует? функция:

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

1
2018-05-16 08:17