17

ローカルでクックブックをテストするためにchef-soloを使用していますが、テストしているクックブックのみを実行できるようにしたいと考えています。現在、chef-solo は、solo.rb で指定された cookbooks ディレクトリ内のすべてのクックブックを実行するようです。json 属性ファイルで実行リストを指定し、solo.rb で json ファイルの場所を指定しましたが、それは役に立たないようです。ローカル構成では機能しないクックブックがあり、実行全体で失敗するため、少なくとも他のすべてのクックブックの属性を解析します。

これまでに見つけた最善の解決策は、テストに必要なクックブックを別のディレクトリに移動し、solo.rb で指定することです。それを行うより良い方法はありますか?

4

5 に答える 5

28

更新:chef-soloは、chef-clientとは別のツールではなくなりました。ドキュメントから:

chef-soloは、クックブックを収束するためにChefサーバーを必要としない方法でchef-clientを実行するコマンドです。chef-soloはchef-clientのChefローカルモードを使用し、chef-client/サーバー構成に存在する次の機能をサポートしていません

この変更は、コミュニティRFCを満たすChefバージョン12.11で実装されました。これは2016年6月8日にリリースされました。以下で説明する古い動作(現時点では4年前からですが)は、の引数で使用できます。--legacy-modechef-solo

Chef Soloに関する最新の情報については、公式ドキュメントをお読みください。

私の元の答えは以下の通りです:

Chef(ソロまたはクライアント)がすべてのクックブックを「実行」するわけではありません。

次のディレクトリにあるすべてのクックブックのRubyファイルをこの順序でロードします。

  • ライブラリ/*.rb
  • プロバイダー/*.rb
  • resources/*。rb
  • 属性/*.rb
  • 定義/*.rb

次に、ノードの展開された実行リストにあるすべてのレシピをロードします。を使用chef-soloすると、これは、で提供されるJSONファイルから取得される-jか、属性ファイルで実行できます。ただし、後者は非推奨であり、推奨されません。

を介して拡張実行リストに含まれているレシピもすべてinclude_recipeロードされます。Chefは、レシピをRubyコードとして評価することでレシピをロードします。リソースまたは定義であると認識するルビーコードに遭遇すると、リソースをリソースコレクションに追加します。これは、すべてのリソースの番号順に並べられたインデックス付きハッシュです。Chefが定義自体ではなく、定義自体ではなく、定義に含まれるリソースをリソースコレクションに追加するという点で、定義は特別です。インクルードされたレシピのリソースinclude_recipeが所定の位置に挿入され、Chefはインクルードレシピを続行します。

Chefは、すべてのリソースのすべてのレシピを処理すると、リソースコレクションをウォークし、コレクションに追加された順序でそれぞれに対して指定されたアクションを実行します。

このプロセスに関するドキュメントを読むことを強くお勧めします。シェフソロに適用されます。クックブックがサーバーからダウンロードされる部分のみがスキップされます。

テストするレシピのみがテストされるようにするには、JSONファイルを介してノードの実行リストにそれらを含めます。次のようになります。

{ "run_list": ["recipe[mything]", "recipe[anotherthing]"] }

実行リストは単なる配列であり、項目はrecipe[cookbookname]またはにすることができますrole[somerole]。Chef Soloのドキュメントで、ChefSoloでロールを使用する方法の詳細を読むことができます。

Chefがクックブックコンポーネント(各クックブックのrubyファイル)をロードしているときにシステム変更が行われている場合は、「You're Doing It Wrong」(tm)であり、レシピから呼び出されたリソースで実行されるようにそれらをリファクタリングする必要があります。

于 2012-03-13T00:49:31.553 に答える
14

また、テスト時にランリストを簡単にオーバーライドできることにも注意してください

chef-solo --override-runlist "role["somerole"],recipe[mycookbook::recipe]"
于 2013-09-02T05:39:31.780 に答える
5

残念ですが、無いと思います。Chef は 2 パス モードで実行されます。最初にクックブックのモデルを解析して構築し (「コンパイル」フェーズ)、次に実行リストで指定したクックブックのみを実行します。これは、コンパイル段階でクックブック間の依存関係を確実にキャッチするためだと思います。コンパイル フェーズは一貫している必要があります。そうしないと、エラーが発生します。

これを本当に理解するには、ruby ブロックリソースを見てください。レシピに含まれるルビはコンパイル時に評価されます。評価時に実行したいすべてのルビは、ルビ ブロック リソースに配置する必要があります。それを理解すると、2 パス評価の性質が明らかになります。

あなたの唯一の選択肢は、あなたがやっているように、一度に 1 つずつクックブックを持ち込むか、属性を修正することだと思います。

于 2012-03-12T18:18:36.720 に答える
2

JSON ファイルを作成する必要があります。そこで、どのクックブックを実行するかを正確に指定できます。

{
  "run_list": [ "recipe[hello-chef]" ]
}

この段階的なチュートリアルで非常によく説明されています: http://codeflex.co/creating-and-running-your-first-chef-cookbook/

于 2018-04-09T07:27:55.033 に答える
1

chef-client --local-mode hello.rb
チェック
https://learn.chef.io/learn-the-basics/ubuntu/configure-a-resource/
https://docs.chef.io/ctl_chef_client.html

于 2016-05-11T08:24:12.077 に答える