Instale um novo pacote usando o Puppet 3.1.1 no Solaris 10?

1

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],
    }
}
    
por jeffjohnson9046 08.05.2013 / 00:20

1 resposta

0

Eu postei a mesma pergunta em ask.puppetlabs.com, e aqui está a resposta que recebi:

How should puppet know, if a package is brand-new? Puppet has to check if the package is already installed.

But this looks like a recent regression bug in the sun package provider because having a short glance at it puppet neither checks the returncode of the pkginfo command, nor does it parse the output for known error messages.

So if you can file a bug at projects.puppetlabs.com/issues, I'll try to look at the issue when I come home. When you file a bug, please drop the ticket number as a comment.

Eu criei o 20629 com o pessoal do Puppet Labs para acompanhar esse problema.

    
por 08.05.2013 / 20:21