Czy lalek ma sposób na zainstalowanie grupy pakietów yum (np. „Narzędzia programistyczne”) oprócz exec?
Czy lalek ma sposób na zainstalowanie grupy pakietów yum (np. „Narzędzia programistyczne”) oprócz exec?
Odpowiedzi:
Dzisiaj spotkałem się z podobną prośbą, ale nie jestem fanem egzekucji, jeśli sprawy można rozwiązać w inny sposób. Więc wybrałem inną ścieżkę i napisałem prosty niestandardowy typ dla „yumgroup”. Wystarczy umieścić te pliki w dowolnym module na ścieżce modułów i to wszystko:
„modulename / lib / puppet / 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
„nazwa modułu / 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
Następnie uruchom agenta marionetkowego z włączoną funkcją pluginsync i możesz użyć niestandardowego typu:
yumgroup {'Base': ensure => present, }
lub:
yumgroup {'Development tools': ensure => absent, }
I możesz zobaczyć, jakie grupy są instalowane, uruchamiając:
puppet resource yumgroup
cieszyć się!
Oto definicja typu zasobu kukiełkowego „yumgroup”. Domyślnie instaluje pakiety domyślne i obowiązkowe i może instalować pakiety opcjonalne.
Ta definicja nie może jeszcze usunąć grup mniam, chociaż byłoby to łatwe. Nie zawracałem sobie głowy, ponieważ w pewnych okolicznościach może powodować pętle w marionetce.
Ten typ wymaga zainstalowania yum-downloadonly rpm i myślę, że działa tylko na RHEL / CentOS / SL 6. W chwili, gdy to pisałem, statusy wyjścia yum w poprzednich wersjach były nieprawidłowe, więc parametr „chyba” nie działał bez rozszerzania na grep dla wyjścia.
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,
}
}
}
}
Celowo pominąłem uczynienie mniam pobrania tylko zależnością, ponieważ może ona kolidować z manifestami innych. Jeśli chcesz to zrobić, zadeklaruj pakiet do pobrania tylko w osobnym pliku manifestu i dołącz go do tej definicji. Nie deklaruj bezpośrednio w tym określeniu, w przeciwnym razie marionetka spowoduje błąd, jeśli użyjesz tego typu zasobów więcej niż raz. Zasób exec powinien następnie wymagać pakietu [„yum-downloadonly”].
class yum_groupinstalls { yumgroup { '"Development tools"': } }
W definicji musiałem podać pełną ścieżkę do yum, która była dla mnie / usr / bin / yum w CentOS 6.2.
Nie mogłem znaleźć niczego w Puppet Type Reference dla typu Package, więc zapytałem na kanale IRC Puppet na Freenode (dziwnie #puppet) i nic nie dostałem, więc myślę, że odpowiedź brzmi „jeszcze nie”.
Możesz sobie z tym poradzić poprzez Puppet Exec Type, aby przeprowadzić niezbędną instalację grupową. Z pewnością dodam dobro onlyif
lub unless
opcję, aby uruchamiała je tylko w razie potrzeby lub ustawiała refreshonly
i uruchamiała za pomocą Notify
tak, aby nie była uruchamiana za każdym razem. Exec
Typ wykona polecenie lokalnie na kliencie dla lalek, który podałeś jest wyzwalany.
Podoba mi się rozwiązanie z niestandardowym zasobem, ale nie jest idempotentne. Moje podejście do istnienia istnieje? funkcjonować:
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')
wymaga,.split("\n")
aby.each
nie powodować błędów.