Установить новый пакет с помощью Puppet 3.1.1 на Solaris 10?
Я довольно новичок в Puppet и Solaris, и у меня возникла проблема с установкой пакета на виртуальную машину Solaris 10 с помощью Puppet. В рамках моего тестирования я хотел посмотреть, смогу ли я установить обновление Java 6 43 на виртуальную машину Solaris 10, на которой было только обновление Java 5 24. Ниже показана проблема, с которой я столкнулся, и мой вопрос.
Среда
Версия Solaris: SunOS 5.10 Generic_142910-17 i386
Кукольный Версия: 3.1.1
проблема
Похоже, что если пакет еще не установлен в Solaris, Puppet не установит его. Кукольный бросает следующее сообщение:
Error: /Stage[main]/Java::Jdk_solaris/Package[SUNWj6cfg]: Could not evaluate: Unable to get information about package SUNWj6cfg because of: No message
Что происходит
Когда puppet пытается установить пакет на компьютере Solaris, он запускает следующую команду, прежде чем пытаться установить пакет (я видел это, когда во время запуска Puppet включен флаг --debug):
pkginfo -l [whatever the package name is]
Пример из вывода агента puppet --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
Да ладно, в этом есть смысл, почему марионетка получает ошибку. Справедливо. Это приводит меня к этим вопросам:
Мой вопрос
Почему Puppet проверяет, существует ли пакет, прежде чем пытаться установить его? Есть ли способ обойти эту проверку, чтобы Puppet установил "новый" пакет?
Исходя из того, что я вижу, кажется, что Puppet может устанавливать на сервер только те пакеты, которые уже существуют (то есть pkginfo может их найти). Это не похоже на желаемое поведение. Я предполагаю, что есть много случаев, когда я хотел бы, чтобы Puppet установил пакет, которого раньше никогда не было на сервере Solaris. По моему опыту, если пакет уже существует, pkgadd перезапишет пакет с новым.
Например, если я хочу установить обновление Java 6 43 на компьютер 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],
}
}
1 ответ
Я отправил тот же вопрос на ask.puppetlabs.com, и вот ответ, который я получил:
Откуда кукла узнает, что упаковка новая? Puppet должен проверить, установлен ли пакет.
Но это похоже на недавнюю ошибку регрессии в
sun
провайдер пакета, потому что, не взглянув на него, кукольный ни проверяет код возвратаpkginfo
команда, а также не анализирует выходные данные для известных сообщений об ошибках.Поэтому, если вы можете отправить сообщение об ошибке по адресу projects.puppetlabs.com/issues, я постараюсь посмотреть на проблему, когда вернусь домой. Когда вы сообщаете об ошибке, пожалуйста, оставьте номер билета в качестве комментария.
Я создал билет 20629 с ребятами из Puppet Labs, чтобы отследить эту проблему.