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
前回と同じように走りました。
同じ問題が発生しました。
私は何が欠けていますか?動作させるには何が必要ですか?
docs の説明に従ってchef_repo_path
が設定されていることを確認してください。
基本的にlocal-mode
は、クックブック、ロール、環境、データバッグなどの場所を知る必要があります。悲しいことに、ドキュメントは、chef_repo_path
を設定する場所/方法についてあまり明確ではありません。
コードからわかることは次のとおりです。
client.rb
が見つかり、cookbook_path
が含まれている場合、chef_repo_path
= "#{cookbook_path}/.."
knife.rb
が見つかり、cookbook_path
が含まれている場合、chef_repo_path = "#{cookbook_path}/.."
pwd
から上向きに検索し、cookbooks
というディレクトリを探します。見つかった場合、cookbooks/..
がchef_repo_pathとして設定されます。pwd
がchef_repo_path
として使用されますBerkshelfを使用している場合は、berks vendor
を実行して、必要なすべてのクックブックを1つのディレクトリに取得することをお勧めします。その後、chef_repo_pathに、ベンダーのクックブックを保持するcookbooks
ディレクトリの親を指定できます。
心に留めておいてください、これはソースコードを10分間掘り下げたからです。
テストのためにローカルで実行しようとすると、同じ「クックブックを解決できません」というエラーが発生しました。 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
数時間後、@ 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
の隣の最後のスラッシュ( "\")も重要だと思います。