我遇到了一种特殊情况,即 Puppet 软件包ensure => latest
指令仅在我的部分系统上有效。在 30 台服务器中,除了 4 台之外,软件包在其他所有服务器上都正确更新。我试图将软件套件的主要版本从 < 9.40 升级到 9.50。我可以指定一个硬级别,但我会遇到多架构通配符问题。
清单代码片段:
# Install packages
$spppackages = [ "hp-snmp-agents", "hpssa", "hp-health", "hp-smh-templates", "hpsmh", "hpssacli", "hponcfg", ]
package { $spppackages:
ensure => latest,
require => Yumrepo['HP-spp'],
}
Mcollective 状态:
mco package hp-snmp-agents status
Summary of Ensure:
9.50-2564.40.rhel6 = 14
9.50-2564.34.rhel5 = 9
9.40-2506.37.rhel6 = 4 <== This is what I'm trying to fix!
9.50-2564.35.rhel5 = 1
我尝试在受影响的系统上使用以下命令进行调试:
puppet apply --verbose --debug --execute 'package { hp-snmp-agents: ensure => latest }'
导致:
Info: Applying configuration version '1393411670'
Debug: Prefetching yum resources for package
Debug: Executing '/bin/rpm --version'
Debug: Executing '/bin/rpm -qa --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH} :DESC: %{SUMMARY}\n''
Error: Could not prefetch package provider 'yum': invalid byte sequence in US-ASCII
Debug: Executing '/bin/rpm -q hp-snmp-agents --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH} :DESC: %{SUMMARY}\n''
Debug: Finishing transaction 11762680
Debug: Storing state
Debug: Stored state in 0.09 seconds
运行yum list updates hp-snmp-agents
显示该软件包可以通过 yum 更新,并且有较新的版本可用:
Installed Packages
hp-snmp-agents.x86_64 9.40-2506.37.rhel6 @HP-spp
Available Packages
hp-snmp-agents.x86_64 9.50-2564.40.rhel6 HP-spp
问题似乎可能出在 rpm 版本查询格式上。手动运行该命令会得到以下结果:
# /bin/rpm -q hp-snmp-agents --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH} :DESC: %{SUMMARY}\n'
hp-snmp-agents 0 9.40 2506.37.rhel6 x86_64 :DESC: Insight Management Agents(SNMP) for HP ProLiant Systems
如果我ensure => 9.50-xxx
打开这个hp-snmp-agents
包,我可以强制它在顽固的系统上工作。即使在那里输入一个虚假的版本号似乎也能启动目录构建,并且 Puppet 代理的后续运行可以正常工作并更新。我只是好奇为什么这在 30 台服务器中的 26 台上无缝运行,而其余的服务器则需要进行调整。
注意,我yum clean all
通过 Mcollective 进行了初始故障排除步骤
答案1
我认为相关问题是这样的:
Debug: Executing '/bin/rpm -qa --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH} :DESC: %{SUMMARY}\n''
Error: Could not prefetch package provider 'yum': invalid byte sequence in US-ASCII
这个错误中讨论了这一点:https://tickets.puppetlabs.com/browse/PUP-736
基本上,在该rpm -qa ...
输出中的某个地方,您会得到一个 UTF-8(或其他非 ASCII)字符,这导致 puppet 认为“yum”提供程序不好。由于“rpm”后备提供程序不受支持ensure => latest
,它会忽略这一点,您会得到旧版本。
您可以升级到包含修复程序的 puppet 3.4.3,或者比较/bin/rpm -qa ... | sort
正常工作和不正常工作的框之间的输出以找到罪魁祸首包。将 LANG=C 更改为 LANG=en_US.UTF-8(或任何其他有效的 UTF-8 LANG)也应该可以暂时解决问题。