Làm thế nào để tôi cài đặt một nhóm gói yum với con rối?


Câu trả lời:


11

Tôi đã gặp phải yêu cầu tương tự ngày hôm nay, nhưng tôi không phải là người hâm mộ của một giám đốc điều hành nếu mọi thứ có thể được giải quyết bằng bất kỳ phương tiện nào khác. Vì vậy, tôi đã chọn một đường dẫn khác và viết một loại tùy chỉnh đơn giản cho 'yumgroup'. Chỉ cần đặt các tệp này vào bất kỳ mô-đun nào trong đường dẫn mô-đun của bạn và đó là:

"tên mô-đun / lib / con rối / nhà cung cấp / 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

"tên mô-đun / lib / con rối / loại / 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

Và sau đó, chạy tác nhân bù nhìn có bật pluginsync và bạn có thể sử dụng loại tùy chỉnh như thế này:

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

hoặc là:

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

Và bạn có thể xem những nhóm nào được cài đặt bằng cách chạy:

puppet resource yumgroup

thưởng thức!


Tôi nghĩ rằng yum_content = yum('grouplist')cần phải có .split("\n")để .eachkhông gây ra lỗi.
alex.pilon

@ alex.pilon cảm ơn vì tiền boa. Nó đã làm việc như thế này trong v3 mặc dù.
Jakov Sosic

4

Đây là một định nghĩa về loại tài nguyên con rối 'yumgroup'. Nó cài đặt các gói mặc định và bắt buộc theo mặc định và có thể cài đặt các gói tùy chọn.

Định nghĩa này không thể loại bỏ các nhóm yum mặc dù nó sẽ dễ dàng thực hiện nó. Tôi đã không bận tâm cho bản thân mình vì nó có thể gây ra các vòng lặp trong rối trong những trường hợp nhất định.

Loại này yêu cầu cài đặt vòng quay yum-downloadonly và tôi nghĩ rằng nó chỉ hoạt động trên RHEL / CentOS / SL 6. Tại thời điểm tôi viết điều này, các trạng thái thoát của yum trên các phiên bản trước đã sai nên tham số 'trừ khi' không hoạt động mà không được mở rộng để grep cho đầu ra.

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

Tôi đã cố tình bỏ qua việc biến yum-downloadon thành một sự phụ thuộc vì nó có thể mâu thuẫn với các biểu hiện của người khác. Nếu bạn muốn làm điều này, hãy khai báo gói yum-downloadonly trong một bảng kê khai riêng và bao gồm điều đó trong định nghĩa này. Đừng khai báo trực tiếp trong định nghĩa này nếu không con rối sẽ báo lỗi nếu bạn sử dụng loại tài nguyên này nhiều lần. Sau đó, tài nguyên exec sẽ yêu cầu Gói ['yum-downloadonly'].


Cảm ơn vì điều đó! Tôi đã tạo một mô-đun có tên yum_groupinstalls và tạo một bảng kê khai init.pp với định nghĩa của bạn và một lớp để cài đặt nhóm công cụ Phát triển. Lưu ý rằng tôi phải trích dẫn tên nhóm: class yum_groupinstalls { yumgroup { '"Development tools"': } } Trong định nghĩa tôi phải chỉ định đường dẫn đầy đủ đến yum là / usr / bin / yum cho tôi trên CentOS 6.2.
Banjer

3

Tôi không thể tìm thấy bất cứ điều gì trong Tham chiếu loại rối cho loại Gói, vì vậy tôi đã hỏi trên kênh Puppet IRC trên Freenode (#puppet, kỳ quặc) và không có gì nên tôi nghĩ câu trả lời là "chưa".


3

Bạn có thể xử lý việc này thông qua Loại rối thực thi để thực hiện cài đặt nhóm cần thiết. Tôi chắc chắn sẽ bao gồm một tùy chọn tốt onlyifhoặc unlessđể nó chỉ thực thi nó khi cần hoặc được đặt thành refreshonlyvà kích hoạt nó thông qua Notifyđể nó không chạy mỗi lần. Các Execloại sẽ thực hiện lệnh cục bộ trên client rối cho bạn miễn là nó được kích hoạt.


1

Tôi thích giải pháp với tài nguyên tùy chỉnh tuy nhiên nó không phải là idempotent. Của tôi có tồn tại? chức năng:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.