とりわけnginxとPhusionPassengerをインストールするためのChefレシピを書いています。簡単に言うと、実行リストのレシピが期待どおりに実行されていないため、修正方法がわからない方法でaptパッケージのインストールが失敗します。完全なシーケンスは少し複雑です、私は本質的な詳細を保つために最善を尽くします。
Webサーバーを希望の状態にカスタマイズするための独自のレシピlr-web
があります。nginx.conf
に変更を加えるアクションの1つです。また、実行リストが次のような全体的な構成を調整する役割もあります。
"run_list":[
"recipe[apt]",
"recipe[nginx]",
"recipe[passenger]",
"recipe[lr-web]"
]
さらに、lr-web
レシピは、そのmetadata.rb
の依存関係としてpassenger
とnginx
をリストします。
apt
およびnginx
レシピは、標準のOpsCodeレシピです。しかし、OpsCodeはrubygemsを使用してpassengerをインストールするため、独自のpassenger
レシピを作成しましたが、そのバージョンはサポートされなくなりました。 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
ノードを収束すると、-y
パッケージインストーラーがnginx-extras
を上書きしたくないため、nginx.conf
フラグを渡しても、apt-getからプロンプトが表示されます。
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
レシピが実行されている場合ですbefore乗客レシピ、これは実行すべきではありません。
そう。私が抱えている問題は、lr-web
がpassenger
の前に実行されているため、nginxconfを変更することです。なぜそれが起こっているのかを調べて停止するか、apt_package
がnginx-extras
をインストールしているときに「nginx.confを上書きしないでください」という「N」応答を渡す方法を見つける必要があります。どちらの迎え角についての提案も大歓迎です。
これはおそらく、nginx
クックブックがaptによってインストールされた後に/etc/nginx/nginx.conf
ファイルを変更し、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の場合)
最初のソリューションを使用して、レシピが2つの異なるパッケージによって提供されるファイルに変更を適用する順序を変更します。
3番目のソリューションを使用して、コードをもう少しクリーンアップします。