fbpx

[和訳] Chef 12.1.0におけるchef_gem Resourceの警告 #getchef

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本稿は Chef 12.1.0 chef_gem resource warnings (2015/02/17) の和訳です。

新しい警告スパムに関する謝罪

Chef 12.1.0がもうすぐリリースされます。マスターにマージされたコミットが原因で、chef_gemのあらゆる利用によって次のような警告が出力されるようになっています。


[2015-02-17T23:59:35+00:00] WARN: chef_gem[fpm] chef_gem compile_time installation is deprecated
[2015-02-17T23:59:35+00:00] WARN: chef_gem[fpm] Please set `compile_time false` on the resource to use the new behavior.
[2015-02-17T23:59:35+00:00] WARN: chef_gem[fpm] or set `compile_time true` on the resource if compile_time behavior is required.

ご迷惑をおかけして申し訳ありません。しかしこれには理由があってのことです。これらの警告を取り除くのは、CHEF-3694エラーを取り除くよりも十分に簡単でしょう。

背景

Omnibusが最初に作られたとき、Omnibusのレポジトリへのgemインストールの方法が必要だったので、Chefは内部的にそれを用いてベースシステムへインストールしていました。そしてchef_gem Resourceが作られました。戻って、require "mysql"をRecipeコードに直接放り込むよりよい方法が思い付かず、requireはコンパイル時なので、収束時までchef_gemのインストールを遅延したら、LoadErrorが常に上げられていました。この問題を避けるためにchef_gemはコンパイル時にインストールするようにResourceを作成しました。

では、2〜3年進んで、ベストプラクティスはrequire行をより怠惰にすることです。Library Cookbookが用いているchef_gemはLWRPを公開しており、収束時に動作するProviderコード内でrequireが発生します。これはコンパイル時にchef_gemをインストールする必要性を排除します。現在、chef_gemの実行をコンパイル時に強制するようにした選択を少し残念に思っています。

そして、すぐに行いたくてコンパイル時にgemを要求しないのに、コンパイル時にchef_gemのインストールを強制されるという問題を引き起こすことになりました。ネイティブgemをインストールしようとするなら、コンパイル時にbuild-essentialsがインストールされていることを強制します。ネイティブgemがzlibやlibxml2やlibxsltに依存しているなら、コンパイル時にまずそれらのライブラリがインストールされていることが必要で、それらのCookbookはcompile_timeフラグが設定されていることが必要です。これにより、コンパイル時に何かインストールさせないというチャンスを得ることができます。

Chef 12.1.0の変更点

Chef 12.1.0でchef_gem Resourceはcompile_timeという真偽値を取るようになり、compile_time falseはこの動作を無効にします。これは推奨の設定です。Chef 12.1.0では、デフォルトではコンパイル時にインストールするので、Chef 12.1.0では何も破壊的変更がない状態でリリースされます。

しかし、これをデフォルトに変更する予定があります。将来の移行での問題を減らすため、chef_gem Resourceがコンパイル時や収束時に動作させたいならそれについて明示しなければいけないと知らせる警告が表示されます。実際には2つのスイッチが用いられます。

Resourceごとのフラグ

すべてのchef_gem Resourceの更新が必要なのでちょっと面倒ですが、新しい挙動に追従するには次のようにcompile_time falseを追加するだけです:


chef_gem "aws-sdk" do
compile_time false
end

RecipeがどこかでLoadErrorを投げて終わってしまうなら (これをテストするには、フレッシュビルドか、この問題を明るみにするにはOmnibusインストールから手動でgemを削除してみるとよいでしょう)、compile_time trueを追加する必要があるでしょう:


chef_gem "aws-sdk" do
compile_time true
end

グローバル設定フラグ

グローバルに挙動を変更できるChef::Config[:chef_gem_compile_time]フラグを追加すると、警告に影響があります。これは3つの異なる値を取ります。

  • nil: 現在のデフォルトで、結果としてスパムのような警告を発する
  • false: 将来のデフォルトで、すべての警告を取り除くが、chef_gemの挙動を変更し、結果としていくつかのRecipeが失敗する
  • true: 現在のデフォルトの挙動を維持し、個別の警告を抑制するが、これがtrueであるChefの実行ごとに一度だけ警告を発する

つまり、nilはスパムのような警告、falseは早期に追従する人向け (いくつかのCookbookは確実に壊れるので、chef_gem Resourceにcompile_time trueが必要になるか、修正が必要になる)、trueは忙しくて手が回らないが、将来のある時点でデフォルトが変更された時点で何かが破壊されてしまうときと、ただちにデフォルトが想定する通りにCookbookを修正するときのトレードオフとなります。

コミュニティCookbook

すべてのコミュニティCookbookはこれらの警告を抑制するよう修正の必要があります。以前のChefバージョンへの後方互換性を要求するなら、次のような報告が望ましいでしょう。


chef_gem "aws-sdk" do
compile_time false if respond_to?(:compile_time)
end

改めて謝罪します

警告スパムについてお詫びしますが、これには理由があってのことです。完全な目標は、非常にわずらわしいコンパイルモードに何かを強制する必要がある物事をなくしていくことです。

新規CTA