web-dev-qa-db-ja.com

ChefSoloで実行するクックブックの指定

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

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

17
Joshua Clark

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

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

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

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

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

Chef(solo OR client)は、すべてのクックブックを「実行」するわけではありません。

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

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

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

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

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

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

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

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

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

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

28
jtimberman

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

chef-solo --override-runlist "role["somerole"],recipe[mycookbook::recipe]"
14
KCD

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

これを本当に理解するには、 Rubyブロック リソースを見てください。レシピに浮かんでいるRuby)は、compile時に評価されます; any Rubyevaluationで実行したい時間は、Rubyブロックリソースに配置する必要があります。つまり、2パス評価の性質が明らかになります。

私はあなたの唯一の選択肢はあなたがしているようにあなたの料理本を一度に一つ持ってくるか、あなたの属性を修正することだと思います。

5
Matt

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

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

このステップバイステップのチュートリアルで非常によく説明されています: http://codeflex.co/creating-and-running-your-first-chef-cookbook/

2
John Detroit
1
7900ms