Назад | Перейти на главную страницу

Установить новый пакет с помощью Puppet 3.1.1 на Solaris 10?

Я новичок в Puppet и Solaris, и у меня возникла проблема при установке пакета на виртуальную машину Solaris 10 с помощью Puppet. В рамках своего тестирования я хотел проверить, смогу ли я установить обновление 43 для Java 6 на виртуальную машину Solaris 10, на которой было только обновление Java 5 24. Ниже показаны проблема, с которой я столкнулся, и мой вопрос.

Окружающая среда

Версия Solaris: SunOS 5.10 Generic_142910-17 i386

Кукольная версия: 3.1.1

Проблема

Кажется, что если пакет еще не установлен в Solaris, Puppet не установит его. Puppet выдает следующее сообщение:

Error: /Stage[main]/Java::Jdk_solaris/Package[SUNWj6cfg]: Could not evaluate: Unable to get information about package SUNWj6cfg because of: No message

Что творится

Когда марионетка пытается установить пакет на машине Solaris, она запускает следующую команду перед попыткой установки пакета (я видел это, когда во время запуска марионетки был включен флаг --debug):

pkginfo -l [whatever the package name is]

Пример вывода марионеточного агента --test --debug:

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

Когда pkginfo ищет имя пакета, которого не существует (т.е. он не установлен, неверное имя и т. Д.), Он возвращает ошибку, например:

vagrant@puppet-master:[/etc/puppet/manifests] $ pkginfo -l SUNWj6cfg
ERROR: information for "SUNWj6cfg" was not found

Okey doke - это имеет смысл, почему марионетка выдает ошибку. Справедливо. Это подводит меня к следующим вопросам:

Мой вопрос

Почему Puppet проверяет, существует ли пакет, прежде чем пытаться его установить? Есть ли способ обойти эту проверку, чтобы Puppet установил «совершенно новый» пакет?

Судя по тому, что я вижу, похоже, что Puppet может устанавливать только уже существующие пакеты (т.е. pkginfo может их найти) на сервере. Это не похоже на желаемое поведение. Я полагаю, что есть множество случаев, когда я бы хотел, чтобы Puppet установил пакет, которого никогда раньше не было на сервере Solaris. По моему опыту, если пакет уже существует, pkgadd перезапишет пакет вместо нового.

Например, если я хочу установить обновление 43 для Java 6 на машину Solaris 10, на которой установлено обновление 21 для Java 6, pkgadd с радостью перезапишет существующие пакеты SUNWj6 *. Более того, если пакетов SUNWj6 * не существует вообще (т.е. я полностью удаляю Java 6 с помощью pkgrm), pkgadd с радостью их установит.

Я хотел бы понять, почему Puppet так себя ведет. Я что-то полностью упускаю? Я вообще понимаю?

Манифесты

Для полноты (и количества слов, я полагаю) вот мои марионеточные манифесты (по крайней мере, соответствующие):

/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],
    }
}

Я разместил тот же вопрос на ask.puppetlabs.com, и вот ответ, который я получил:

Как марионетке узнать, новенькая ли упаковка? Puppet должен проверить, установлен ли уже пакет.

Но это похоже на недавнюю регрессионную ошибку в sun поставщик пакетов, потому что, бегло взглянув на марионетку, она не проверяет код возврата pkginfo команда и не анализирует вывод на предмет известных сообщений об ошибках.

Так что, если вы можете сообщить об ошибке на странице projects.puppetlabs.com/issues, я постараюсь разобраться с проблемой, когда вернусь домой. Когда вы сообщаете об ошибке, пожалуйста, оставьте номер заявки в качестве комментария.

Я создал билет 20629 с людьми из Puppet Labs, чтобы отследить эту проблему.