我对Puppet和Solaris非常陌生,我遇到了使用Puppet在Solaris 10 VM上安装软件包的问题。 作为我的testing的一部分,我想看看是否可以在只有Java 5更新24的Solaris 10虚拟机上安装Java 6更新43.下面显示的是我遇到的问题和我的问题。
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
Okey doke – 这是有道理的,为什么傀儡会得到一个错误。 很公平。 这导致我这些问题:
为什么在尝试安装之前,Puppet检查包是否存在? 有没有办法绕过这个检查,所以木偶将安装一个“全新的”包?
根据我所看到的,似乎Puppet只能在服务器上安装已经存在的软件包(即pkginfo可以find它们)。 这似乎并不是理想的行为。 我想有很多情况下,当我想要Puppet安装一个从未在Solaris服务器上存在的软件包时。 这是我的经验,如果一个软件包已经存在,pkgadd会覆盖这个软件包w /一个新的。
例如,如果我想要在具有Java 6 update 21的Solaris 10计算机上安装Java 6 update 43,pkgadd将会愉快地覆盖现有的SUNWj6 *软件包。 此外,如果SUNWj6 *软件包根本不存在(即,我通过pkgrm完全删除Java 6),pkgadd会快速安装它们。
我想了解为什么木偶会这样做。 我完全错过了什么? 我甚至有道理吗?
为了完整性(和我的猜测),这里是我的木偶清单(无论如何):
/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上发布了同样的问题 ,这里是我收到的答案:
傀儡怎么知道,如果一个包是全新的? 木偶必须检查包是否已经安装。
但是这看起来像
sun包提供程序中最近的一个回归错误,因为简短地看一下puppet既不检查pkginfo命令的返回码,也不分析已知错误消息的输出。所以如果你可以在projects.puppetlabs.com/issues上提交bug,我会在回家的时候看看这个问题。 当你提交一个错误时,请把这个票号作为评论。
我已经与木偶实验室人员创build票20629跟踪这个问题。