【问题标题】:Why can't chef resolve my cookbooks?为什么厨师不能解决我的食谱?
【发布时间】:2014-12-11 03:08:36
【问题描述】:

简介 我正在学习 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 没有找到食谱

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

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

并以与上次相同的方式运行。

我遇到了同样的问题。

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

【问题讨论】:

  • 您是将“这些行”添加到您的 berksfile 还是您的 default.rb 配方?
  • 到 default.rb 配方
  • 我可能是错的,但你没有提到在修改 berksfile 后做一个berks install。您可能还希望使用 berks vendor 创建一个包含所有需要的说明书的目录,并将 chef-client repo 路径指向该目录。总而言之,你的食谱在你的磁盘上,但不是零厨师看的地方。
  • @Tensibai 你是对的,我没有提到它,对不起,我的错!我更新了问题

标签: chef-infra chef-recipe berkshelf


【解决方案1】:

确保您已按照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. 厨师可以尝试占卜道路。 The code 将从pwd 向上搜索一个名为cookbooks 的目录。如果找到它,那么 cookbooks/.. 将被设置为您的 chef_repo_path。
  4. 如果一切都失败了,pwd 将用作您的chef_repo_path

如果您使用的是 Berkshelf,最好的办法是发送berks vendor 以获得一个目录,其中包含您需要的所有食谱。然后,您可以将 chef_repo_path 指向包含您销售的说明书的 cookbooks 目录的父级。

请注意,这是从 10 分钟的源代码挖掘中得出的,所以我可能不太正确。

【讨论】:

  • 如果我使用 Berkshelf,它应该位于 ~/.berkshelf,对吧?它不应该寻找这条路吗?我尝试过使用其他食谱(比如这本 supermarket.getchef.com/cookbooks/windows )并且它有效......
  • 我不能肯定,因为我不使用本地模式。我的建议是您使用berks vendor 将所有依赖项捆绑到一个说明书文件夹中,然后明确分配说明书路径。即使它确实默认为 ~/.berkshelf,您也不会希望长时间使用该位置。很快你就会有多个版本的说明书,并且需要数据包、角色或环境。你最好的方法是为这些东西指定一个专门的位置。
  • 我明白了,问题是我要把这本食谱上传到 Amazon OpsWorks,所以我将无法设置路径等等。不幸的是,它必须“开箱即用”:(
  • 两个不相关的东西。您的问题不在于您的食谱,而在于您的本地配置。当您将其推送到 OpsWorks 时,您的 AWS 节点将被配置为从 OpsWorks 提取说明书。您是否按原样尝试过 opsworks 中的食谱? (确保将依赖项保留在 metadata.rb 文件中)
  • 好的,我试试。我确定我做错了什么,我将用我刚刚的尝试来更新问题
【解决方案2】:

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

您的食谱需要保存在名为 cookbooks 的文件夹下的文件夹中,这似乎是硬编码的“魔法”,但它似乎可以保存在任何地方,例如 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 来测试,尽管您需要在至少 1 台机器上执行 berks 命令的 berkshelf,因为在没有 ChefDK 的情况下安装该命令是一场噩梦。拥有berks 后,您可以运行berks package 并将它创建的文件复制到只有chef-client 的机器并将其添加到某处,然后在包含cookbooks 文件夹的目录中运行chef-client -z -o your_cookbook

要让厨师使用综合安装程序,您就有足够的空间来引导节点或运行配方。

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

【讨论】:

    【解决方案3】:

    在尝试结合@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 旁边的最后一个斜杠(“\”)也很重要。

    【讨论】:

      【解决方案4】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2021-11-01
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多