Jawaban:
Saya telah menemukan permintaan serupa hari ini, tapi saya bukan penggemar eksekutif jika semuanya dapat diselesaikan dengan cara lain. Jadi saya telah memilih jalur yang berbeda dan menulis jenis kustom sederhana untuk 'yumgroup'. Cukup letakkan file-file ini di modul apa saja di modulepath Anda dan hanya itu:
"modulename / lib / boneka / provider / 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 / puppet / 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
Dan setelah itu, jalankan agen boneka dengan pluginsync diaktifkan, dan Anda dapat menggunakan tipe khusus seperti ini:
yumgroup {'Base': ensure => present, }
atau:
yumgroup {'Development tools': ensure => absent, }
Dan Anda dapat melihat grup apa yang diinstal dengan menjalankan:
puppet resource yumgroup
Nikmati!
Berikut adalah definisi dari jenis sumber daya boneka 'yumgroup'. Ini menginstal paket default dan wajib secara default, dan dapat menginstal paket opsional.
Definisi ini tidak dapat menghapus grup yum, meskipun itu mudah untuk mewujudkannya. Saya tidak repot-repot untuk diri saya sendiri karena dapat menyebabkan loop pada boneka dalam keadaan tertentu.
Jenis ini mengharuskan rpm yum-download hanya diinstal dan saya pikir itu hanya bekerja pada RHEL / CentOS / SL 6. Pada saat saya menulis ini, status keluar yum pada versi sebelumnya salah sehingga parameter 'kecuali' tidak berfungsi tanpa diperpanjang untuk menerima output.
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,
}
}
}
}
Saya sengaja menghilangkan membuat unduhan yum hanya ketergantungan karena mungkin bertentangan dengan manifes orang lain. Jika Anda ingin melakukan ini, nyatakan paket yum-download hanya dalam manifes terpisah dan sertakan yang ada di dalam definisi ini. Jangan mendeklarasikan secara langsung dalam definisi ini karena boneka akan memberikan kesalahan jika Anda menggunakan jenis sumber daya ini lebih dari sekali. Sumber daya exec kemudian harus membutuhkan Paket ['yum-download hanya'].
class yum_groupinstalls { yumgroup { '"Development tools"': } }
Dalam definisi saya harus menentukan path lengkap ke yum yang merupakan / usr / bin / yum untuk saya di CentOS 6.2.
Saya tidak dapat menemukan apa pun di Referensi Jenis Wayang untuk jenis Paket, jadi saya bertanya pada saluran IRC Wayang di Freenode (#puppet, anehnya) dan tidak mendapatkan apa-apa jadi saya pikir jawabannya "belum".
Anda dapat menangani ini melalui Jenis Puppet Exec untuk menjalankan instalasi kelompok yang diperlukan. Saya pasti akan menyertakan barang onlyif
atau unless
opsi sehingga hanya mengeksekusi ketika dibutuhkan atau diatur ke refreshonly
dan memicu melalui Notify
sehingga tidak dijalankan setiap waktu sekalipun. The Exec
jenis akan mengeksekusi perintah secara lokal pada klien boneka Anda berikan itu dipicu.
Saya suka solusi dengan sumber daya kustom namun tidak idempoten. Pandangan saya tentang ada? fungsi:
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
yum_content = yum('grouplist')
perlu.split("\n")
agar.each
tidak menyebabkan kesalahan.