web-dev-qa-db-ja.com

シェフが料理の本を解決できないのはなぜですか?

Intro職場でのサーバー管理を自動化するChefを学んでいます。 here からchefdk 3.0をダウンロードし、chefを使用して最初のクックブックを作成しようとしています。

重要Windows環境ではテスト目的でこれを使用していますが、Windowsにはiptablesがないため失敗することを期待していますが、期待していませんクックブックが見つからないと言って失敗する。 Windows cookbook を使用してみましたが、動作します。

問題クックブックを作成して実行することはできますが、スーパーマーケットから依存関係を参照することはできません。

私は2つの選択肢を試しました:

代替案1

次のコマンドを使用してクックブックを作成しました

chef generate cookbook learn_chef_httpd

(from このチュートリアル

チュートリアルを完了できたので、別のクックブックの参照をテストしたいので、 simple_iptables を選択しました

この行を追加しました

cookbook 'simple_iptables', '~> 0.7.0'

スーパーマーケットで説明されているように、私のBerksfileに。

次に、これらの行をdefault.rbファイルに追加しました。

include_recipe 'simple_iptables'

# Allow HTTP, HTTPS
simple_iptables_rule "http" do
  rule [ "--proto tcp --dport 80",
         "--proto tcp --dport 443" ]
  jump "ACCEPT"
end

そして、私は次を使用してクックブックを実行します:

chef-client --local-mode --runlist 'recipe[learn_chef_httpd]'

問題は、シェフが料理の本を見つけられないことです

Chef::Exceptions::CookbookNotFound
----------------------------------
Cookbook simple_iptables not found. If you're loading simple_iptables from anoth er cookbook, make sure you configure the dependency in your metadata

メタデータに追加してみました:

depends 'simple_iptables', '~> 0.7.0'

しかし、まだエラーが発生します:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables

代替案2

私はまだそれを機能させようとしているので、「バークシェルフ方式」にしようとしたので、新しいクックブックを作成しました。

berks cookbook test

そして、私はこの行を追加しました

cookbook 'simple_iptables', '~> 0.7.0'

スーパーマーケットで説明されているように、私のBerksfileに。

次に、これらの行をdefault.rbファイルに追加しました。

include_recipe 'simple_iptables'

# Allow HTTP, HTTPS
simple_iptables_rule "http" do
  rule [ "--proto tcp --dport 80",
         "--proto tcp --dport 443" ]
  jump "ACCEPT"
end

Berksインストールの実行:

バークスインストール

そしてそれを実行しました:

chef-client --local-mode --runlist 'recipe[test]'

同じエラーが戻ってきました

Chef::Exceptions::CookbookNotFound
----------------------------------
Cookbook simple_iptables not found. If you're loading simple_iptables from anoth er cookbook, make sure you configure the dependency in your metadata

メタデータに追加してみました:

depends 'simple_iptables', '~> 0.7.0'

しかし、まだエラーが発生します:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables

〜/ berkshelfフォルダーを見ると、クックブックがあります。

**代替3 **

AmazonでCentOS 6.5 EC2インスタンスを起動し、Ruby 2.1.3とChef。が〜/ chef-repo/cookbooksフォルダーを作成しました

Berkshelfを使用してクックブックを作成し、実行しました

bundle install

他の代替物のように参照/コードを追加しました

berks install

前回と同じように走りました。

同じ問題が発生しました。

私は何が欠けていますか?動作させるには何が必要ですか?

16
JSBach

docs の説明に従ってchef_repo_pathが設定されていることを確認してください。

基本的にlocal-modeは、クックブック、ロール、環境、データバッグなどの場所を知る必要があります。悲しいことに、ドキュメントは、chef_repo_pathを設定する場所/方法についてあまり明確ではありません。

コードからわかることは次のとおりです。

  1. client.rbが見つかり、cookbook_pathが含まれている場合、chef_repo_path = "#{cookbook_path}/.."
  2. knife.rbが見つかり、cookbook_pathが含まれている場合、chef_repo_path = "#{cookbook_path}/.."
  3. シェフはその道筋を占うことを試みることができます。 コードpwdから上向きに検索し、cookbooksというディレクトリを探します。見つかった場合、cookbooks/..がchef_repo_pathとして設定されます。
  4. 他のすべてが失敗した場合、pwdchef_repo_pathとして使用されます

Berkshelfを使用している場合は、berks vendorを実行して、必要なすべてのクックブックを1つのディレクトリに取得することをお勧めします。その後、chef_repo_pathに、ベンダーのクックブックを保持するcookbooksディレクトリの親を指定できます。

心に留めておいてください、これはソースコードを10分間掘り下げたからです。

18
Tejay Cardon

テストのためにローカルで実行しようとすると、同じ「クックブックを解決できません」というエラーが発生しました。 ChefサーバーなしでChefDKをインストールせずにCookbookを実行し、Chef以外の開発者がワークステーションを1回だけ簡単にセットアップできるようにする可能性があるため、次のワークフローをまとめました。

クックブックはクックブックと呼ばれるフォルダーの下のフォルダーに配置する必要がありますが、これはハードコーディングされた「魔法」のように見えますが、userdir/projects/cookbooks/my_cookbook_name/など、どこにでも配置できるようです。

依存関係のBerksfileがある場合は、chef-client -z -o my_cookbook_nameを実行する前にローカルで取得する必要があるので、berks vendorを実行して、依存関係を現在のフォルダーのcookbooksディレクトリにプルします。

berks vendorコマンドは、他の依存関係をクックブックディレクトリにプルし、chef-zero/chef-soloがそれらを見つけられるようにします。管理者のPowerShellプロンプトで次を実行します。Command Prompt互換性がありますが、cmd.exeの使用を推奨しないようにしています。

cd /path/to/cookbooks/my_cookbook_name berks vendor . chef-client -z -o my_cookbook_name

クライアントに組み込まれた新しいchef-zeroを使用する利点は、テストするために完全なChefDKが必ずしも必要ではないことです。 。 berksを入手したら、berks packageを実行し、作成したファイルをchef-clientだけでマシンにコピーし、それをどこかに追加してから、を含むディレクトリでchef-client -z -o your_cookbookを実行します。 cookbooksフォルダー。

シェフだけを取得するには、オムニバスインストーラーを使用し、ノードをbootstrap=.

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chef

バークが必要で、ChefDKをすばやく入手する方法が必要な場合は、これでうまくいきます。

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chefdk

2
dragon788

数時間後、@ kilianと@gratzyの here の回答の組み合わせを試してみましたが、これは役に立ちました。

cmd /c E: && cd /d E:\Items_CI Exploration\chef\chef-repo\cookbooks\ && chef-client --local-mode --runlist 'recipe[cisamplecookbooks::web]'

はい、引用符なし。また、前に追加された「E:」にも注意してください。ただし、「&」の数に違いはありませんでした。

"E:\Items_CI Exploration\chef\chef-repo\cookbooks\"これは、クックブックを実行するためのパスです。 cookbooksの隣の最後のスラッシュ( "\")も重要だと思います。

1