[和訳] Chef Client 12.1.0 の複数パッケージインストール機能 #getchef
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本稿は Chef Client 12.1.0 Multipackage Installs (2015/03/03) の和訳です。
この投稿(訳注:原文)はFacebookのプロダクションエンジニアであるPhil Dibowitzに書いていただきました。
例年のSummit同様、昨年のChef Community SummitではHack Dayがありました。私のHackプロジェクトはChefのpackage Resourceを拡張し、一度に複数パッケージを扱えるようにすることでした。なぜって? 2つの主要なユースケースがあります。
- 新しいシステムをプロビジョニングするとき、パッケージの基本セットをインストールする時間がとてもかかります。パッケージをダウンロードするためのHTTPトランザクションの開始、パッケージのディスクへの書き込み、HTTPトランザクションの終了、yumやaptやその他トランザクションの開始、パッケージをディスクへの展開、トランザクションのコミットと終了、そしてこれらを各パッケージに対して繰り返すということです。一つのHTTPトランザクションでそれらのパッケージすべてをダウンロードできるなら多くの時間が節約でき、一度にすべてをインストールできるならもっと節約できるでしょう。パッケージを1つのグループにまとめるというちょっとした試みでも、私達にとってのプロビジョニング時間は4分の節約になりました。
- ときどき、2つ以上のパッケージを1つのトランザクションで更新しなければいけないことがあります...それらの間でファイルが移動したり、上流のパッケージャーがよくない依存関係を設定していたり。Chefはそういう場合をうまく扱うことができませんでした。例えば、execute Resourceを使って直接yumやaptなどを呼び出せば別かもしれませんが。
26ファイルを変更して、955行挿入、266行削除というかなり大きな作業となり、Lamont Granquistに多大な手助けをしてもらい、2月4日、ついにマージされChef 12.1.0にて利用可能になりました。この結果、コードがきれいになり、ちょっと汚いところもあるけれど、次のように書けるようになりました。
package [ 'coreutils', 'lspci', …] do
action :upgrade
end
これはパッケージセットのすべてを最新に保つのみでなく、必要に応じてサブセットの更新だけを行ったり、更新されたパッケージの通知を行います。
これはちょっとログが汚くなってしまうことに注意してください。パッケージのリストが特に長い場合、代わりに次のようにすることを推奨します。
package 'base OS packages' do
package_name [ 'coreutils', 'lspci', …]
action :upgrade
end
この形式のよいところは、このリストからパッケージを追加したり削除したりしても、これに対するnotifiesやsubscribesを更新する必要がないということです。
また、単なる:upgradeをサポートしているだけでなく、次のようにも書けます。
package 'my packages' do
package_name [ 'package1', 'package2' ]
version [ 'version1', 'version2' ]
action :install
end
繰り返しになりますが、これらのパッケージの状態を収束させるために必要な変更すべてを記述し、すべてを単一のyumやaptのトランザクションで実行します。
もちろん:removeと:purgeも同じです。複数パッケージはyumかapt Providerを用いているプラットフォームでサポートされています。基本となるpackage Providerで完全なサポートができたら、サブクラスも同じようにサポートするべきで、yumとaptのみが適切な改造を行いました。
加えて、一度のmultipackage呼び出しでインストールされるパッケージの一覧を生成できるmultipackage CookbookをLamontが書きました。後方互換性のため、Chefバージョン12.1.0未満では単一のパッケージのループにフォールバックするようになっています。
この記事がこれまで以上にすばらしい調理の助けとなれば幸いです!