web-dev-qa-db-ja.com

シェフのレシピが正しくないため、aptパッケージのインストールが失敗する

とりわけ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の依存関係としてpassengernginxをリストします。

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-webpassengerの前に実行されているため、nginxconfを変更することです。なぜそれが起こっているのかを調べて停止するか、apt_packagenginx-extrasをインストールしているときに「nginx.confを上書きしないでください」という「N」応答を渡す方法を見つける必要があります。どちらの迎え角についての提案も大歓迎です。

5
Ian Dickinson

これはおそらく、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]"
 ]

正しく答えるように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:

最初のソリューションを使用して、レシピが2つの異なるパッケージによって提供されるファイルに変更を適用する順序を変更します。

3番目のソリューションを使用して、コードをもう少しクリーンアップします。

3
Mike Fiedler