Sou muito novo no Puppet e no Solaris e estou com problemas para instalar um pacote em uma VM do Solaris 10 usando o Puppet. Como parte do meu teste, eu queria ver se eu poderia instalar o Java 6 update 43 em uma VM do Solaris 10 que só tinha o Java 5 update 24. Abaixo está o problema que estou tendo e a minha pergunta.
Ambiente
Versão do Solaris: SunOS 5.10 Generic_142910-17 i386
Versão do fantoche: 3.1.1
Problema
Parece que, se um pacote ainda não estiver instalado no Solaris, o Puppet não o instalará. Puppet lança a seguinte mensagem:
Error: /Stage[main]/Java::Jdk_solaris/Package[SUNWj6cfg]: Could not evaluate: Unable to get information about package SUNWj6cfg because of: No message
O que está acontecendo
Quando o fantoche tenta instalar um pacote em uma máquina Solaris, ele executa o seguinte comando antes de tentar instalar o pacote (vi isso quando o sinalizador --debug está ativado durante uma execução de marionete):
pkginfo -l [whatever the package name is]
Exemplo do agente puppet --test - output do depurador:
Debug: Executing '/usr/bin/pkginfo -l'
Debug: Executing '/usr/bin/pkginfo -l SUNWj6cfg'
Error: /Stage[main]/Java::Jdk_solaris/Package[SUNWj6cfg]: Could not evaluate: Unable to get information about package SUNWj6cfg because of: No message
Quando o pkginfo está procurando por um nome de pacote que não existe (ou seja, ele não está instalado ou o nome está errado, etc), ele retorna um erro, da seguinte forma:
vagrant@puppet-master:[/etc/puppet/manifests] $ pkginfo -l SUNWj6cfg
ERROR: information for "SUNWj6cfg" was not found
Okey doke - isso faz sentido porque o boneco está recebendo um erro. Justo. Isso me leva a essas perguntas:
Minha pergunta
Por que o Puppet está checando se o pacote existe antes de tentar instalá-lo? Existe uma maneira de contornar essa verificação para que o Puppet instale um pacote "novo em folha"?
Com base no que estou vendo, parece que o Puppet só pode instalar pacotes que já existem (ou seja, o pkginfo pode encontrá-los) no servidor. Isso não parece um comportamento desejável. Eu imagino que há muitos casos em que eu gostaria que o Puppet instalasse um pacote que nunca existiu em um servidor Solaris. Minha experiência é que, se um pacote já existir, o pkgadd sobrescreverá o pacote com um novo.
Por exemplo, se eu quiser instalar o Java 6 update 43 em uma máquina Solaris 10 que tenha o Java 6 update 21, o pkgadd irá sobrescrever os pacotes SUNWj6 * existentes. Além disso, se os pacotes SUNWj6 * não existirem (isto é, eu removo completamente o Java 6 via pkgrm), o pkgadd irá instalá-los alegremente.
Eu gostaria de entender porque o Puppet se comportaria dessa maneira. Eu estou totalmente perdendo alguma coisa? Eu estou fazendo sentido?
Manifests
Para completar (e contagem de palavras, eu acho), aqui estão os meus manifestos de marionetes (os relevantes, de qualquer forma):
/etc/puppet/modules/java/manifests/init.pp:
class java ($distribution,
$version,
$update
) {
$class_prefix = $distribution ? {
jdk => 'java::jdk',
jre => 'java::jre',
}
case $::operatingsystem {
'RedHat', 'CentOS': {
class { "${java::class_prefix}_redhat":
version => "${java::version}"
}
->
Class["java"]
}
'Solaris': {
class { "${java::class_prefix}_solaris":
version => "${java::version}",
update => "${java::update}",
}
->
Class["java"]
}
}
}
/etc/puppet/modules/java/manifests/jdk_solaris.pp:
class java::jdk_solaris ($version,
$update
) {
$working_dir = "/opt/tmp"
$zip_file_name_32 = "jdk-${version}u${update}-solaris-i586.tar.Z"
$zip_file_name_64 = "jdk-${version}u${update}-solaris-x64.tar.Z"
$admin_file = "java_admin"
$java_packages = [ "SUNWj6cfg",
"SUNWj6dev",
"SUNWj6jmp",
"SUNWj6man",
"SUNWj6rt" ]
file {
"${java::jdk_solaris::working_dir}/${java::jdk_solaris::zip_file_name_32}":
ensure => file,
source => "puppet:///modules/java/${java::jdk_solaris::zip_file_name_32}";
"${java::jdk_solaris::working_dir}/${java::jdk_solaris::admin_file}":
ensure => file,
source => "puppet:///modules/java/${java::jdk_solaris::admin_file}";
"${java::jdk_solaris::working_dir}/SUNWj6cfg/install/checkinstall":
ensure => file,
source => "puppet:///modules/java/SUNWj6cfg/checkinstall",
require => Exec["zcat_32"];
"${java::jdk_solaris::working_dir}/SUNWj6dev/install/checkinstall":
ensure => file,
source => "puppet:///modules/java/SUNWj6dev/checkinstall",
require => Exec["zcat_32"];
"${java::jdk_solaris::working_dir}/SUNWj6jmp/install/checkinstall":
ensure => file,
source => "puppet:///modules/java/SUNWj6jmp/checkinstall",
require => Exec["zcat_32"];
"${java::jdk_solaris::working_dir}/SUNWj6man/install/checkinstall":
ensure => file,
source => "puppet:///modules/java/SUNWj6man/checkinstall",
require => Exec["zcat_32"];
"${java::jdk_solaris::working_dir}/SUNWj6rt/install/checkinstall":
ensure => file,
source => "puppet:///modules/java/SUNWj6rt/checkinstall",
require => Exec["zcat_32"];
}
file { "${java::jdk_solaris::working_dir}":
ensure => directory,
}
exec { "zcat_32":
cwd => "${java::jdk_solaris::working_dir}",
command => "zcat ${java::jdk_solaris::zip_file_name_32} | tar -xf -",
creates => [
"${java::jdk_solaris::working_dir}/SUNWj6cfg",
"${java::jdk_solaris::working_dir}/SUNWj6dev",
"${java::jdk_solaris::working_dir}/SUNWj6jmp",
"${java::jdk_solaris::working_dir}/SUNWj6man",
"${java::jdk_solaris::working_dir}/SUNWj6rt"
],
path => "/usr/bin:/usr/sbin:/bin:/sbin:/usr/local/bin:/usr/local/sbin:/opt/csw/bin:/opt/csw/sbin",
require => [
File["${java::jdk_solaris::working_dir}"],
File["${java::jdk_solaris::working_dir}/${java::jdk_solaris::zip_file_name_32}"],
],
}
#------------------------------------------------------------------------------------------------------------------------
# INSTALL JDK
#------------------------------------------------------------------------------------------------------------------------
package { $java_packages:
ensure => installed,
source => "${java::jdk_solaris::working_dir}",
adminfile => "${java::jdk_solaris::working_dir}/${java::jdk_solaris::admin_file}",
require => [
Exec["zcat_32"],
File[
"${java::jdk_solaris::working_dir}/SUNWj6cfg/install/checkinstall",
"${java::jdk_solaris::working_dir}/SUNWj6dev/install/checkinstall",
"${java::jdk_solaris::working_dir}/SUNWj6jmp/install/checkinstall",
"${java::jdk_solaris::working_dir}/SUNWj6man/install/checkinstall",
"${java::jdk_solaris::working_dir}/SUNWj6rt/install/checkinstall"
] # end file array
], # end require array
}
#------------------------------------------------------------------------------------------------------------------------
# CLEAN UP AFTER INSTALLATION
#------------------------------------------------------------------------------------------------------------------------
exec { "jdk_solaris_cleanup":
cwd => "${java::jdk_solaris::working_dir}",
command => "rm -r ${java::jdk_solaris::admin_file} SUNWj* THIRDPARTYLICENSEREADME.txt COPYRIGHT LICENSE README.html ${java::jdk_solaris::zip_file_name_32}",
path => "/usr/bin:/usr/sbin:/bin:/sbin:/usr/local/bin:/usr/local/sbin:/opt/csw/bin:/opt/csw/sbin",
require => Package[$java_packages],
}
}