Мы хотели установить "lsscsi" пакет на всех наших Серверах Linux и создать декларацию для него:
# pack_lsscsi.pp
class common::pack_lsscsi {
case $operatingsystem {
RedHat, CentOS, Debian: {
package { 'lsscsi':
ensure => 'installed',
}
}
}
}
"lsscsi" Пакет имеет только "libc6" как зависимость - так никакой brainer вообще. Все пошли прекрасные на наших серверах Red Hat и CentOS, но некоторые системы Debian сошли с ума. Марионетка удалила между 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
Какая-либо идея, как это могло произойти?
Thomas
Это происходит потому, что aptitude
любит удалять пакеты, которые, по его мнению, не используются. aptitude
отслеживает каждую устанавливаемую программу и классифицирует её как "ручную" или "автоматическую". Пакеты "Manual" - это пакеты, которые явно запрашивают установку. "Автоматические" пакеты - это пакеты, которые вы специально не запрашивали, но были установлены как зависимости. Например, aptitude install irssi
установит irssi, а также множество библиотек, включая libncurses, lbperl, lbtinfo, libval и другие. Если в какой-то момент вы удалите irssi и это был единственный установленный пакет, который нуждался в некоторых из этих библиотек, то aptitude
удалит и ненужные автоматически установленные библиотеки. К сожалению, раньше aptitude
и apt-get
плохо играли вместе и упакованные apt-get
часто рассматривались aptitude
как автоматически установленные и, таким образом, кандидаты на удаление. Более новые версии apt-get
работают гораздо лучше в согласии с aptitude
, но эта проблема проявилась в то время, когда эти проблемы существовали.
Если, по каким-то причинам, вы все еще получаете такое поведение сейчас, то есть пара вариантов. Самым простым было бы просто перейти на использование провайдера apt
для типа Puppet's pack
. Это полностью устранило бы путаницу, связанную с тем, какие пакеты он должен удалить в aptitude
.
Если вам нужно продолжать использовать провайдер aptitude
, то вам нужно исправить идеи aptitude
о том, что используется. Запустите aptitude dist-upgrade
и посмотрите на каждый пакет, который он хочет удалить. Для каждого пакета, который вы хотите сохранить, запустите aptitude unmarkauto <пакет-имя>
(например, aptitude unmarkauto apt-file curl
). Тогда убедитесь, что вы используете aptitude
только для установки пакетов с этого момента.
По моему опыту, единственное, что aptitude
делает лучше, чем текущие версии apt-get
- это интерактивный интерфейс curses и возможность изменять набор установки/удаления пакетов в середине сеанса работы с командной строкой. Кукле не нужны никакие интерактивные возможности, так что вы действительно должны быть в порядке, просто используя apt
провайдер.