17

简介 我正在学习 Chef 以自动化工作中的服务器管理。我从这里下载了 chefdk 3.0 ,现在我正在尝试使用 chef 构建我的第一本食谱。

重要 的是,我在 Windows 环境中使用它进行测试,我确实希望它会失败,因为 Windows 没有 iptables,但我不希望它会因为找不到说明书而失败。我试过使用Windows 食谱,它可以工作。

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

我尝试了两种选择:

备选方案 1

我使用以下命令创建食谱

chef generate cookbook learn_chef_httpd

(来自本教程

我能够完成教程,现在我想测试参考另一本食谱,所以我选择了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 way”,所以我创建了一本新的食谱。

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

并以我上次的方式运行。

我遇到了同样的问题。

我错过了什么?我需要什么才能让它工作?

4

4 回答 4

23

确保您已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 分钟开始的,所以我可能不太正确。

于 2014-10-16T02:45:29.307 回答
3

在寻找在本地运行以进行测试时,我遇到了相同的“无法解析食谱”错误。由于我可能希望在没有 Chef 服务器但也没有安装 ChefDK 的情况下运行说明书,以便非 Chef 开发人员进行简单的一次性工作站设置,因此我整理了以下工作流程。

你的食谱需要放在一个名为食谱的文件夹下的文件夹中,这似乎是硬编码的“魔法”,但它似乎可以放在任何地方,例如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

使用客户端内置的新 chef-zero 的美妙之处在于,您不一定需要完整的 ChefDK 来测试,尽管您至少需要一台机器上的 berks 命令的 berkshelf,因为在没有 ChefDK 的情况下安装它是一场噩梦. 拥有berks后,您可以运行berks package它创建的文件并将其复制到仅具有 chef-client 的机器并将其添加到某处,然后chef-client -z -o your_cookbook在包含该cookbooks文件夹的目录中运行。

要获得只厨师使用综合安装程序,你有足够的引导节点或运行配方。

. { 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

于 2017-11-13T22:09:50.793 回答
1

经过几个小时让我心烦意乱,尝试结合@kilian和@gratzy的答案,有帮助,

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也很重要。

于 2016-04-26T09:16:07.203 回答
0

另一种选择:当您的角色/配方名称输入错误时,也可能会出现以下错误。

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

将食谱上传到 chef-server 后,请确保在运行列表中调用正确的名称, 例如

$ 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
于 2020-11-15T15:39:10.327 回答