我正在编写一个 Chef 配方,用于安装 nginx 和 Phusion Passenger 等。简而言之,我的运行列表中的配方没有按照我期望的顺序执行,这导致 apt 包安装失败,我不知道如何修复。整个顺序有点复杂,我会尽力保留必要的细节。
我有自己的方法,lr-web
用于将 Web 服务器自定义为我想要的状态。它的一个操作是进行更改nginx.conf
。我还有一个角色来协调整体配置,其运行列表是:
"run_list":[
"recipe[apt]",
"recipe[nginx]",
"recipe[passenger]",
"recipe[lr-web]"
]
此外,该lr-web
配方在其 中列出了passenger
和nginx
作为依赖项metadata.rb
。
和是标准的 OpsCodeapt
配方nginx
。但我写了自己的passenger
配方,因为 OpsCode 使用 rubygems 来安装 Passenger,但该版本不再受支持。按照modrails.compassenger
要通过 apt 安装,我的配方中有以下步骤:
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 conf。我要么需要找出发生这种情况的原因并停止它,要么找到一种方法,在apt_package
安装时nginx-extras
传递“N”响应,说“不要覆盖 nginx.conf”。任何关于任何攻击角度的建议都非常受欢迎。
答案1
这可能是因为cookbook在 apt 安装后nginx
修改了文件,而 dpkg 命令会警告您有关该更改。这也会与 发生冲突。/etc/nginx/nginx.conf
/etc/nginx/sites-available/default
改变应用内容的顺序。
将乘客配方置于 nginx 配方之上将确保 repo 和软件包得到安装。由于 nginx-extras 提供了自己的 nginx.conf 文件,因此该文件将立即被 nginx 配方覆盖,并从那里开始进行控制。
修改后的运行列表将如下所示:
"run_list":[
"recipe[apt]",
"recipe[passenger]",
"recipe[nginx]",
"recipe[lr-web]"
]
告诉 Apt 正确回答
您也可以尝试强制 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 上)
结论:
使用第一个解决方案来改变配方对两个不同包提供的文件的更改应用的顺序。
使用第三种解决方案进一步清理代码。