为什么厨师不能解决我的食谱?

JSB*_*ach 16 chef-infra chef-recipe berkshelf

简介 我正在学习厨师在工作中自动化服务器管理.我从这里下载了chefdk 3.0 ,现在我正在尝试用厨师制作我的第一本食谱.

重要 我在Windows环境中使用它进行测试,我确实认为它失败了,因为Windows没有iptables,但我不认为它会失败,说它找不到食谱.我尝试过使用Windows cookbook,但它确实有效.

问题 我能够创建菜谱并运行它,但我无法引用超市的依赖关系.

我尝试过两种选择:

备选方案1

我使用以下命令来创建cookbook

chef generate cookbook learn_chef_httpd
Run Code Online (Sandbox Code Playgroud)

(来自本教程)

我能够完成教程,现在我想测试引用另一本食谱,所以我选择了simple_iptables

我添加了这一行

cookbook 'simple_iptables', '~> 0.7.0'
Run Code Online (Sandbox Code Playgroud)

对于我的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
Run Code Online (Sandbox Code Playgroud)

我使用以下方法运行食谱:

chef-client --local-mode --runlist 'recipe[learn_chef_httpd]'
Run Code Online (Sandbox Code Playgroud)

问题是厨师找不到食谱

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
Run Code Online (Sandbox Code Playgroud)

我尝试将其添加到元数据中:

depends 'simple_iptables', '~> 0.7.0'
Run Code Online (Sandbox Code Playgroud)

但我仍然得到一个错误:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables
Run Code Online (Sandbox Code Playgroud)

备选方案2

我仍然试图让它工作,所以我也尝试使它成为"berkshelf方式",所以我创建了一个新的食谱.

berks cookbook test
Run Code Online (Sandbox Code Playgroud)

我添加了这一行

cookbook 'simple_iptables', '~> 0.7.0'
Run Code Online (Sandbox Code Playgroud)

对于我的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
Run Code Online (Sandbox Code Playgroud)

执行berks安装:

berks安装

并运行它:

chef-client --local-mode --runlist 'recipe[test]'
Run Code Online (Sandbox Code Playgroud)

同样的错误又回来了

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
Run Code Online (Sandbox Code Playgroud)

我尝试将其添加到元数据中:

depends 'simple_iptables', '~> 0.7.0'
Run Code Online (Sandbox Code Playgroud)

但我仍然得到一个错误:

Error Resolving Cookbooks for Run List:
Missing Cookbooks:

No such cookbook: simple_iptables
Run Code Online (Sandbox Code Playgroud)

我看了〜/ berkshelf文件夹,那里有食谱.

**替代3**

我在亚马逊上启动了CentOS 6.5 EC2实例,安装了Ruby 2.1.3和Chef.创建了一个〜/ chef-repo/cookbooks文件夹

我用berkshelf创建了一本食谱,跑了

bundle install
Run Code Online (Sandbox Code Playgroud)

然后添加参考/代码,如同其他替代品

berks install
Run Code Online (Sandbox Code Playgroud)

和我上次做的一样.

我遇到了同样的问题.

我错过了什么?我需要做些什么才能让它发挥作用?

Tej*_*don 18

确保您已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. 如果一切都失败了,pwd将被用作你的chef_repo_path

如果您使用的是Berkshelf,最好的办法是berks vendor为了获得所需的所有烹饪书目录.然后,您可以将chef_repo_path指向cookbooks包含您所销售食谱的目录的父级.

请注意,这是从挖掘源代码的10分钟开始,所以我可能没有这么做.