Назад | Перейти на главную страницу

Неправильные рецепты шеф-повара приводят к сбою установки пакета apt

Я пишу рецепт Chef для установки среди прочего nginx и Phusion Passenger. Краткое изложение состоит в том, что рецепты в моем списке выполнения не выполняются в ожидаемом мной порядке, и это приводит к сбою установки пакета apt, который я не знаю, как исправить. Полная последовательность немного сложна, я сделаю все возможное, чтобы сохранить основные детали.

У меня есть свой рецепт, lr-web для настройки веб-сервера в желаемое состояние. Одно из его действий - внести изменения в nginx.conf. У меня также есть роль по организации общей конфигурации, список выполнения которой:

 "run_list":[
   "recipe[apt]",
   "recipe[nginx]",
   "recipe[passenger]",
   "recipe[lr-web]"
 ]

Более того, lr-web списки рецептов passenger и nginx как зависимости в его metadata.rb.

В apt и nginx рецепты являются стандартными OpsCode. Но я написал свой passenger recipe, поскольку в OpsCode для установки пассажира используются rubygems, но эта версия больше не поддерживается. Следуя советам по modrails.com для установки через apt у меня есть следующие шаги в моем passenger рецепт блюда:

cookbook_file "/etc/apt/sources.list.d/passenger.list" do
  source "passenger.list"
  mode 600
  action :create_if_missing
end

bash "apt-get-update" do
  user "root"
  code <<-EOF
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
    apt-get install apt-transport-https ca-certificates
    apt-get update
EOF
end

apt_package "nginx-extras" do
  action :install
end

Когда я объединяю узел, я получаю приглашение от apt-get, даже если оно передает -y флаг, потому что nginx-extras установщик пакетов не хочет перезаписывать nginx.conf:

Configuration file `/etc/nginx/nginx.conf'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** nginx.conf (Y/I/N/O/D/Z) [default=N] ? 
Configuration file `/etc/nginx/sites-available/default'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** default (Y/I/N/O/D/Z) [default=N] ? dpkg: error processing nginx-common (--configure):
 EOF on stdin at conffile prompt
dpkg: dependency problems prevent configuration of nginx-extras:
 nginx-extras depends on nginx-common (= 1:1.4.4-2.4.0.37~precise1); however:
  Package nginx-common is not configured yet.
dpkg: error processing nginx-extras (--configure):
 dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
 nginx-common
 nginx-extras
E: Sub-process /usr/bin/dpkg returned an error code (1)

Насколько я могу судить, это может произойти только в том случае, если мой lr-web рецепт запущен перед рецепт пассажира, которого не должно быть.

Так. У меня проблема в том, что lr-web работает раньше passenger, и, таким образом, измените конфигурацию nginx. Мне нужно либо выяснить, почему это происходит, и остановить это, либо найти способ, когда apt_package устанавливает nginx-extras чтобы передать ответ «N», в котором говорится «не перезаписывать nginx.conf». Любые предложения по любому углу атаки будут очень приветствоваться.

Вероятно, это происходит с тех пор, как nginx поваренная книга изменяет /etc/nginx/nginx.conf файл после того, как он был установлен apt, и команда dpkg предупреждает вас об этом изменении. Это также будет противоречить /etc/nginx/sites-available/default.

Измените порядок того, что и когда применяется.

Размещение рецепта пассажира над рецептом nginx гарантирует, что репо и пакеты будут установлены. Поскольку nginx-extras предоставляет свой собственный файл nginx.conf, он будет немедленно перезаписан рецептом nginx и оттуда будет контролироваться.

Ваш измененный список запусков будет выглядеть так:

 "run_list":[
   "recipe[apt]",
   "recipe[passenger]",
   "recipe[nginx]",
   "recipe[lr-web]"
 ]

Скажите Apt правильно ответить

Вы также можете попробовать force apt реагировать так, как вы хотите - это может быть слишком агрессивным по отношению к поведению apt, потенциально влияя на остальную часть выполнения Chef. Я не рекомендую это делать, но вы можете попробовать и посмотреть, работает ли он для вашего варианта использования.

ENV['DEBIAN_FRONTEND'] = 'noninteractive'
package 'nginx-extras' do
  options '--force-yes'
  options '-o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"'
  action :install
end

Подробнее об этом Вот.

Это может привести к тому, что таким образом вы ответите на другие ресурсы и не столкнетесь с проблемой оператору, а также приведет к тому, что ресурсы будут перезаписывать друг друга и вызывать нежелательные уведомления для других ресурсов, такие как запуск перезапуска nginx при изменении файла конфигурации, и т.п.

Преобразование bash в ресурс apt_repository

Это на самом деле не для решения проблемы заказа, а просто для лучшего использования ресурсов Chef.

Вы показываете, что предоставляете файл поваренной книги, а затем выполняете ресурсы bash для их активации. Это происходило бы при каждом запуске, если бы не было защиты с помощью оператора only_if / not_if.

В apt поваренная книга, которую вы используете уже есть ресурс репозитория, и изменит ваш рецепт, чтобы он выглядел так:

apt_repository 'passenger' do
  uri          'https://oss-binaries.phusionpassenger.com/apt/passenger'
  distribution node['lsb']['codename']
  components   ['main']
  keyserver    'keyserver.ubuntu.com'
  key          '561F9B9CAC40B2F7'
end

Затем это будет вести себя более разумно, чем выполнение команд apt-get во время выполнения, и результат будет почти таким же:

deb     https://oss-binaries.phusionpassenger.com/apt/passenger precise main

(в Ubuntu 12.04)

TL, DR:

Используйте первое решение, чтобы изменить порядок, в котором рецепт применяет изменения к файлам, предоставленным двумя разными пакетами.

Используйте третье решение, чтобы немного очистить код.