Respostas:
Encontrei um pedido semelhante hoje, mas não sou fã de um executivo se as coisas puderem ser resolvidas por qualquer outro meio. Então, eu escolhi um caminho diferente e escrevi um tipo personalizado simples para 'yumgroup'. Basta colocar esses arquivos em qualquer módulo no seu modulepath e é isso:
"nome do módulo / 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
"nome do módulo / 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
Depois disso, execute o agente fantoche com o pluginsync ativado e você pode usar um tipo personalizado como este:
yumgroup {'Base': ensure => present, }
ou:
yumgroup {'Development tools': ensure => absent, }
E você pode ver quais grupos estão instalados executando:
puppet resource yumgroup
desfrutar!
Aqui está uma definição de um tipo de recurso de fantoche 'yumgroup'. Ele instala pacotes padrão e obrigatórios por padrão e pode instalar pacotes opcionais.
Essa definição ainda não pode remover os grupos yum, embora seja fácil fazer isso acontecer. Eu não me incomodei por mim mesma, porque pode causar loops no boneco sob certas circunstâncias.
Esse tipo requer que o yum-downloadonly rpm esteja instalado e acho que só funciona no RHEL / CentOS / SL 6. No momento em que escrevi isso, os status de saída do yum nas versões anteriores estavam errados, portanto o parâmetro 'salvo' não funcionaria sem ser estendido para grep para saída.
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,
}
}
}
}
Omiti deliberadamente tornar o yum-download apenas uma dependência, pois pode entrar em conflito com os manifestos dos outros. Se você quiser fazer isso, declare o pacote yum-downloadonly em um manifesto separado e inclua-o nessa definição. Não declare diretamente nesta definição, caso contrário, o fantoche causará um erro se você usar esse tipo de recurso mais de uma vez. O recurso exec deve exigir o Package ['yum-downloadonly'].
class yum_groupinstalls { yumgroup { '"Development tools"': } }
Na definição, eu tive que especificar o caminho completo para o yum que era / usr / bin / yum para mim no CentOS 6.2.
Não encontrei nada na Referência de tipo de fantoche para o tipo de pacote, então perguntei no canal IRC do Puppet no Freenode (#puppet, estranhamente) e não consegui nada, então acho que a resposta "ainda não".
Você pode lidar com isso através de um Puppet Exec Type para executar a instalação de grupo necessária. Certifico-me de incluir um item onlyif
ou unless
opção para que ele só seja executado quando necessário ou definido como refreshonly
e acionado por meio de um Notify
modo que não seja executado sempre. O Exec
tipo executará o comando localmente no cliente fantoche para você, desde que seja acionado.
Gosto da solução com um recurso personalizado, no entanto, não é idempotente. Minha opinião sobre o existe? função:
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')
precisa de um.split("\n")
para que o.each
não cause erros.