我们希望在我们所有的 Linux 服务器上安装“lsscsi”包并为其构建清单:
# pack_lsscsi.pp
class common::pack_lsscsi {
case $operatingsystem {
RedHat, CentOS, Debian: {
package { 'lsscsi':
ensure => 'installed',
}
}
}
}
“lsscsi” 软件包仅具有“libc6”依赖项 - 因此完全无需考虑。在我们的 Red Hat 和 CentOS 服务器上一切正常,但某些 Debian 系统却出现了问题。Puppet 删除了 10 到 180 个软件包,例如这个:
Sep 17 10:46:06 cacti01 puppet-agent[28008]
(/Stage[main]/Common::Pack_lsscsi/Package[lsscsi]/ensure) change from purged
to present failed: Execution of '/usr/bin/aptitude -y -o
DPkg::Options::=--force-confold install lsscsi' returned 255: Reading package
lists...#012Building dependency tree...#012Reading state information...#012Reading
extended state information...#012Initializing package states...#012Writing extended
state information...#012The following NEW packages will be installed:#012 lsscsi
#012The following packages will be REMOVED:#012 alien{u} apt-file{u} ash{u} at{u}
autopoint{u} biff{u} bin86{u} bison{u} #012 bwidget{u} checkpolicy{u} cramfsprogs{u}
curl{u} dbus{u} debhelper{u} #012 deborphan{u} dhcp-client{u} doc-linux-de{u}
dosfstools{u} dselect{u} #012 ethtool{u} fdutils{u} finger{u} flex{u} flip{u}
gcc-3.4-base{u} gdb{u} #012 gdbserver{u} gettext{u} gnu-efi{u} gnupg-doc{u}
hicolor-icon-theme{u} #012 html2text{u} hwdata{u} ifenslave{u} ifenslave-2.6{u}
intltool-debian{u} #012 iptraf{u} joe{u} kernel-package{u} language-env{u}
lgtoclnt{u} #012 libappconfig-perl{u} libapt-pkg-perl{u} libatk1.0-0{u}
libatk1.0-data{u} #012 libaudit0{u} libavahi-client3{u} libavahi-common-data{u}
#012 libavahi-common3{u} libbeecrypt6{u} libbind9-50{u} #012 libcompress-raw-zlib-
perl{u} libcompress-zlib-perl{u} #012 libconfig-file-perl{u} libcroco3{u} libcrypt-
ssleay-perl{u} libcups2{u} #012 libcurl3{u} libdb1-compat{u} libdb4.2{u} libdbus-1-
3{u} #012 libdigest-hmac-perl{u} libdigest-sha1-perl{u} libdirectfb-1.0-0{u} #012
libdns58{u} libdrm-intel1{u} libdrm-radeon1{u} libdrm2{u} libelf1{u} #012 libfam0{u}
libfam0c102{u} libfile-remove-perl{u} libfont-afm-perl{u} #012 libfs6{u} libgl1-mesa-
dri{u} libgl1-mesa-glx{u} libglade2-0{u} #012 libglu1-mesa{u} libgtk2.0-0{u}
libgtk2.0-bin{u} libgtk2.0-common{u} #012 libhtml-format-perl{u} libhtml-parser-
perl{u} libhtml-tagset-perl{u} #012 libhtml-tree-perl{u} libice6{u} libident{u}
libio-compress-base-perl{u} #012 libio-compress-zlib-perl{u} libio-stringy-perl{u}
Sep 17 10:46:09 cacti01 puppet-agent[28008]: Finished catalog run in 54.68 seconds
知道这是怎么发生的吗?
托马斯
答案1
发生这种情况是因为aptitude
喜欢删除它认为未使用的软件包。 aptitude
跟踪它安装的每个程序并将其分类为“手动”或“自动”。 “手动”软件包是明确请求安装的软件包。 “自动”软件包是您没有明确请求但作为依赖项安装的软件包。例如,aptitude install irssi
将安装 irssi,还将安装大量库,包括 libncurses、lbperl、lbtinfo、libval 等。如果您在某个时候删除了 irssi,并且它是唯一需要其中一些库的已安装软件包,aptitude
则也会删除不需要的自动安装的库。
不幸的是,以前的情况是aptitude
和apt-get
不能很好地协同工作,而 打包安装的apt-get
通常会被视为aptitude
自动安装,因此应被删除。 较新版本的apt-get
可以更好地与 协同工作aptitude
,但这个问题在这些问题存在时就出现了。
如果出于某种原因,您现在仍然遇到此行为,则有几个选项。最简单的方法是改为使用apt
Puppetpackage
类型的提供程序。这将完全避免aptitude
对应该删除哪些包的任何困惑。
如果您需要继续使用该aptitude
提供商,则需要修复aptitude
有关正在使用的内容的想法。运行aptitude dist-upgrade
并查看它要删除的每个包。对于您知道要保留的每个包,运行aptitude unmarkauto <package-name>
(例如aptitude unmarkauto apt-file curl
)。然后确保aptitude
从那时起仅使用 进行包安装。
根据我的经验,唯一aptitude
比当前版本更好的apt-get
是交互性:curses 界面和在命令行会话中修改软件包安装/删除集的能力。Puppet 不需要任何交互功能,因此您确实应该只使用提供程序就可以了apt
。