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

时间:2014-10-15 21:50:20

标签: chef chef-recipe berkshelf

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

重要 我在Windows环境中使用它进行测试,我确实希望它失败,因为Windows没有iptables,但我不认为它会失败,说它无法找到该菜谱。我尝试使用Windows cookbook并且有效。

问题 我能够创建食谱并运行它,但我无法从超市引用依赖项。

我尝试过两种选择:

备选方案1

我使用以下命令创建了食谱

chef generate cookbook learn_chef_httpd

(来自this tutorial

我能够完成教程,现在我想测试引用另一本食谱,所以我选择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

我仍在努力让它发挥作用,所以我也试着制作它" berkshelf方式",所以我创造了一本新的食谱。

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安装:

  

berks install

并运行它:

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 **

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

我使用berkshelf创建了一本食谱,然后运行

bundle install

添加了其他替代品中的参考/代码 然后

berks install

并按照我上次的方式运行。

我遇到了同样的问题。

我错过了什么?我需要做些什么才能使用它?

4 个答案:

答案 0 :(得分:17)

确保按照docs中的说明配置了chef_repo_path

基本上local-mode需要知道在哪里可以找到您的食谱,角色,环境,数据包等。遗憾的是,文档并不是非常清楚您在何处/如何设置chef_repo_path

这是我从代码中可以看到的内容。

  1. 如果找到client.rb且包含cookbook_pathchef_repo_path = "#{cookbook_path}/.."
  2. 如果找到knife.rb且包含cookbook_pathchef_repo_path = "#{cookbook_path}/.."
  3. 厨师可以尝试神圣的道路。 The code将从pwd向上搜索,查找名为cookbooks的目录。如果找到,则cookbooks/..将被设置为chef_repo_path。
  4. 如果所有其他方法都失败,pwd将用作chef_repo_path
  5. 如果你正在使用Berkshelf,最好的办法是做一个berks vendor,以获得你需要的所有食谱的单个目录。然后,您可以将chef_repo_path指向保存您所售食谱的cookbooks目录的父目录。

    请注意,这是从挖掘源代码的10分钟开始,所以我可能没有完全正确。

答案 1 :(得分:2)

在寻找本地运行测试的同时,我遇到了同样的问题"无法解决食谱问题"错误。由于我可能希望在没有Chef服务器的情况下运行cookbook,但也没有安装ChefDK,非厨师开发人员可以进行简单的一次性工作站设置,我将以下工作流程放在一起。

您的食谱需要存放在名为cookbook的文件夹下,这似乎是硬编码的"魔术",但它似乎能够在任何地方生活,例如userdir/projects/cookbooks/my_cookbook_name/

如果您有依赖项的Berksfile,则需要先运行它们才能运行chef-client -z -o my_cookbook_name,然后运行berks vendor将依赖项拉入当前文件夹中的cookbooks目录。

berks vendor命令将您的其他依赖项拉入cookbooks目录,因此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

使用内置于客户端的新厨师零的美妙之处在于,您不一定需要完整的ChefDK进行测试,尽管在至少一台机器上需要berkshelf用于berks命令ChefDK是一场噩梦。获得berks之后,您可以运行berks package并将其创建的文件复制到仅使用chef-client的计算机并将其添加到某处,然后在包含{的目录中运行chef-client -z -o your_cookbook {1}}文件夹。

为了让厨师使用omnibus安装程序,你就足以引导节点或运行配方。

cookbooks

如果你需要你的berks并希望快速获得ChefDK,那么这就可以了。

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

答案 2 :(得分:1)

经过几个小时的尝试,尝试将@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旁边的最后一个斜杠(" \")也很重要。

答案 3 :(得分:0)

另一个选项:当您在角色/食谱名称中输入错字时,也会出现以下错误。

Missing Cookbooks:
------------------
The following cookbooks are required by the client but don't exist on the server:
* some-cookbook-name

一旦您将菜谱上传到厨师服务器,请确保在运行列表中使用正确的名称例如

$ cd <chef-repo-path>
$ chef generate cookbook example
$ knife cookbook upload example

//output:
Uploading example [0.1.0]
Uploaded 1 cookbook.

$ vim roles/example-role.rb
 
name "example-role"
description "example to some role"
run_list    "recipe[example]"

//save and upload
$ knife role from file example-role.rb