Вопрос или проблема
Я пишу скрипт для автоматической установки пакета, который находится в нашем репозитории, это программное обеспечение с одной из отмеченных конфигурационных файлов Debian. Есть ли какой-либо параметр, который я могу передать в apt-get
/aptitude
, чтобы он принял новые конфигурационные файлы?
Мне нужен эквивалент dpkg --force-confnew
для apt
/aptitude
Мне нужно ответить на следующий вопрос, заданный при установке с помощью apt-get
, с Y
Конфигурационный файл «/opt/application/conf/XXX.conf»
==> Файл в системе создан вами или скриптом.
==> Файл также предоставлен сопровождающим пакета.
Что бы вы хотели с ним сделать? Ваши варианты:
Y или I : установить версию сопровождающего пакета
N или O : оставить вашу текущую установленную версию
D : показать различия между версиями
Z : отправить этот процесс в фоновый режим для изучения
Действие по умолчанию - оставить вашу текущую версию.
Дополнительная информация:
Также я передаю пароль sudo
через pipe, чтобы выполнить команду
echo "mysudopass"|sudo -S apt-get mypackage
Это вызывает ошибку при установке, когда установка переходит в интерактивную фазу конфигурации.
Я использую Ubuntu 10.04
версия apt: apt 0.7.25.3
Почему я не могу использовать dpkg
: эти Debian пакеты должны быть установлены из репозитория, и у меня нет локальных пакетов Debian на моей машине
Вы можете передать параметры dpkg
в apt-get
, например:
apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew install pkgname1 pkgname2 ...
С --force-confdef
, если старые конфигурационные файлы все еще существуют, они не будут перезаписаны. Так что вы, вероятно, не будете его использовать, я просто документирую это для других.
sudo
не будет запрашивать пароль, если вы отключите опцию аутентификации для пользователя или добавите метку NOPASSWD
в конкретную запись, например:
someuser ALL = NOPASSWD: /usr/bin/apt-get
Вы можете попробовать следующее:
export DEBIAN_FRONTEND=noninteractive
apt-get -q -y install whatever-2
Но обратите внимание, что это имеет последствия, например, пустые пароли по умолчанию (возможно, вам следует использовать инструменты развертывания/конфигурации, такие как puppet, chef, fabric…?).
Смотрите sudoers(5) о том, как позволить выполнение sudo
без пароля.
В дополнение к другим ответам, вам может понадобиться установить окружение UCF_FORCE_CONFFNEW=1.
Например, openssh в debian stretch использует ucf (не debconf) в openssh-server/openssh-7.4p1/debian/openssh-server.postinst
для запроса о конфигурационном файле. (Вы можете увидеть openssh-server.postinst
, используя dget
по адресу http://security.debian.org/debian-security/pool/updates/main/o/openssh/openssh_7.4p1-10+deb9u4.dsc)
Нам пришлось использовать все хитрости на этой странице в дополнение к широкому использованию debconf preseeding.
Тем не менее, мы остановились в шаге от export DEBIAN_FRONTEND=noninteractive
, потому что мы хотим знать, если мы что-то упустили (что может быть важно). Наш случай использования – оператор начинает операцию. Ожидается, что обновление будет неинтерактивным, но оператор присутствует, если что-то пойдет не так и появится диалоговое окно. Ваша ситуация может отличаться.
Но export DEBIAN_FRONTEND=noninteractive
– это ваш proverbial молот.
Просто будьте осторожны: Установка -o Dpkg::Options::=--force-confnew
и/или UCF_FORCE_CONFFNEW=1
означает, что все конфигурационные файлы из установленных пакетов вернутся к исходным. Например, в случае openssh-server
, ваш /etc/ssh/sshd_config
будет сброшен к заводским настройкам. И, например, PermitRootLogin=yes
будет удален. Но, конечно, вы это не используете, так что все будет в порядке! 😉
В качестве альтернативы тому, что предложил forcefsck, я предлагаю добавить это в настройки APT, чтобы вам не приходилось добавлять эти трудночитаемые параметры каждый раз. Также это будет полезно для автоматических обновлений, если они у вас настроены.
Создайте файл /etc/apt/apt.conf.d/71debconf
со следующим содержимым:
Dpkg::Options {
"--force-confnew";
};
Примечание (от Geoff): это изменение будет глобальным. Если у вас есть другие пакеты в системе, которые вы хотите, чтобы обновления выполнялись автоматически, но которые вы также настроили вручную, это не будет подходящим решением.
Согласно dpkg-1.21.1ubuntu2.2/src/configure.c,
–force-confnew используется, если вызывается show_prompt. –force-confask может быть необходим в некоторых неясных условиях
Ответ или решение
Для специалистов в области информационных технологий, стремящихся автоматизировать процессы установки программного обеспечения на Debian, сталкиваются с необходимостью принятия новых конфигурационных файлов пакетов. Продуманное использование инструментов apt-get и aptitude поможет вам реализовать без присутствия человека установочные процессы, в которых новые конфигурационные файлы принимаются автоматически. В представленном вопросе обсуждается, как передать apt-get команду принять новые конфигурации, аналогично тому, как это делает dpkg с параметром –force-confnew.
Теоретическая часть
В терминологии пакетов Debian, конфигурационные файлы представляют собой файлы, которые должны быть сохранены, даже если сам пакет будет удален. Они играют важную роль в персонализации и управлении поведением установленных программ. При обновлении пакетов, зачастую возникают конфликты между новыми версиями этих файлов и тех, что уже существуют на системе.
При использовании dpkg, параметр –force-confnew позволяет точно указать системе, что при возникновении конфликта с конфигурационными файлами предпочтение должно отдаваться новым файлам из пакета, игнорируя старые версии. Следует иметь в виду, что это может перезаписать все имеющиеся настройки программ, что может быть нежелательным в определённых обстоятельствах.
Пример
Для выполнения аналогичной задачи в контексте apt-get, можно использовать параметры, передаваемые команде dpkg через apt-get. Важной частью решения является использование переменной окружения DEBIAN_FRONTEND и передача соответствующих опций dpkg:
export DEBIAN_FRONTEND=noninteractive
apt-get -y -o Dpkg::Options::=--force-confnew install <имя пакета>
В данном примере, опция DEBIAN_FRONTEND=noninteractive отключает любые интерактивные запросы от пользователя, делая процесс установки полностью автономным. Дополнительно, опция –force-confnew в контексте Dpkg сообщает apt-get заменять существующие конфигурационные файлы новыми версиями из пакета без запроса.
Применение
Для применения вышеописанного метода на практике, необходимо адаптировать конфигурацию системы и скрипты установки под конкретные требования вашей инфраструктуры. Следует также учитывать безопасность данного подхода — автоматическое принятие новых конфигурационных файлов может привести к непредвиденным изменениям в системе, особенно если эти файлы содержат важные настройки безопасности.
Пример расширенного использования опций выглядит следующим образом:
- Предварительная настройка sudo: Настройте файлы конфигурации sudo таким образом, чтобы определенные пользователи или скрипты могли выполнять команды без ввода пароля:
someuser ALL = NOPASSWD: /usr/bin/apt-get
- Модификация apt.conf: Для систематического применения данных опций создание нового файла конфигурации в /etc/apt/apt.conf.d/ может автоматизировать процесс на уровне системы:
echo 'Dpkg::Options {
"--force-confnew";
};' | sudo tee /etc/apt/apt.conf.d/71debconf
- Пересмотр возможных последствий: Следует учитывать, что использование такого подхода без должного контроля может привести к потере специфических пользовательских настроек.
Таким образом, автоматическое принятие новых конфигурационных файлов при использовании apt-get может значительно упростить управление пакетами в мультиплатформенных окружениях. Однако, данный подход должен применяться аккуратно и взвешенно, особенно в контексте критически важных систем. Ваши действия должны учитывать не только техническую реализацию, но и возможные бизнес-риски, связанные с обновлениями настроек.
Подобный баланс позволит вам оптимизировать процессы без потери контроля над конфигурацией систем, что является ключевым элементом в эффективном управлении IT-активами.