Я пишу рецепт 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]"
]
Вы также можете попробовать 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 при изменении файла конфигурации, и т.п.
Это на самом деле не для решения проблемы заказа, а просто для лучшего использования ресурсов 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)
Используйте первое решение, чтобы изменить порядок, в котором рецепт применяет изменения к файлам, предоставленным двумя разными пакетами.
Используйте третье решение, чтобы немного очистить код.