ฉันจะติดตั้งกลุ่มแพคเกจยำด้วยหุ่นได้อย่างไร


10

หุ่นมีวิธีการติดตั้งกลุ่มแพคเกจยำ (เช่น 'เครื่องมือในการพัฒนา') นอกเหนือจาก exec หรือไม่

คำตอบ:


11

ฉันเจอคำขอที่คล้ายกันในวันนี้ แต่ฉันไม่ใช่แฟนของผู้บริหารหากสิ่งต่าง ๆ สามารถแก้ไขได้ด้วยวิธีอื่น ดังนั้นฉันจึงเลือกเส้นทางที่แตกต่างและเขียนประเภทที่กำหนดเองง่ายๆสำหรับ 'yumgroup' เพียงแค่วางไฟล์เหล่านี้ในโมดูลใด ๆ ในโมดูลพา ธ ของคุณและนั่นคือ:

"modulename / 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

"modulename / lib / หุ่น / พิมพ์ / 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-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-downloadon ในรายการแยกต่างหากและรวมไว้ในรายการนี้ อย่าประกาศโดยตรงในการกำหนดนี้มิฉะนั้นหุ่นเชิดจะให้ข้อผิดพลาดหากคุณใช้ทรัพยากรประเภทนี้มากกว่าหนึ่งครั้ง ทรัพยากร exec ควรต้องการแพคเกจ ['yum-downloadonly']


ขอบคุณสำหรับสิ่งนี้! ฉันสร้างโมดูลชื่อ yum_groupinstalls และสร้างรายการ init.pp พร้อมคำจำกัดความและคลาสเพื่อติดตั้งกลุ่มเครื่องมือสำหรับการพัฒนา โปรดทราบว่าฉันต้องพูดชื่อกลุ่ม: class yum_groupinstalls { yumgroup { '"Development tools"': } } ในคำจำกัดความฉันต้องระบุเส้นทางแบบเต็มไปยัง yum ซึ่งเป็น / usr / bin / yum สำหรับฉันใน CentOS 6.2
Banjer


3

คุณสามารถจัดการสิ่งนี้ผ่านPuppet Exec Typeเพื่อดำเนินการติดตั้งกลุ่มที่จำเป็น ฉันจะต้องแน่ใจว่าได้รวมสิ่งที่ดีonlyifหรือunlessตัวเลือกเพื่อที่จะดำเนินการเมื่อจำเป็นหรือตั้งค่าrefreshonlyและเรียกใช้ผ่านทางNotifyเพื่อไม่ให้ทำงานทุกครั้ง Execประเภทจะรันคำสั่งภายในลูกค้าหุ่นสำหรับคุณให้มันถูกเรียก


1

ฉันชอบโซลูชันที่มีทรัพยากรที่กำหนดเอง แต่ก็ไม่ใช่ idempotent สิ่งที่ฉันทำมีอยู่? ฟังก์ชั่น:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.