在 AWS Opsworks 上使用 Chef 12 无法找到 Chef Community Cookbooks

Failing To Find Chef Community Cookbooks Using Chef 12 On AWS Opsworks

问题

当 AWS OpsWorks 上的 运行 自定义说明书出现 setup_failed 状态时,实例和失败日志中显示以下内容:

[2016-03-26T22:53:48+00:00] INFO: Started chef-zero at chefzero://localhost:8889 with repository at /var/chef
One version per cookbook
data_bags at /var/chef/runs/62832572-cb67-421a-8309-d831140d7b98/data_bags
nodes at /var/chef/runs/62832572-cb67-421a-8309-d831140d7b98/nodes
 
[2016-03-26T22:53:48+00:00] INFO: Forking chef instance to converge...
[2016-03-26T22:53:48+00:00] INFO: *** Chef 12.7.2 ***
[2016-03-26T22:53:48+00:00] INFO: Chef-client pid: 17842
[2016-03-26T22:53:49+00:00] INFO: HTTP Request Returned 404 Not Found: Object not found: chefzero://localhost:8889/nodes/test1.localdomain
[2016-03-26T22:53:49+00:00] INFO: Setting the run_list to ["recipe[my_cookbook::default]"] from CLI options
[2016-03-26T22:53:49+00:00] INFO: Run List is [recipe[my_cookbook::default]]
[2016-03-26T22:53:49+00:00] INFO: Run List expands to [my_cookbook::default]
[2016-03-26T22:53:49+00:00] INFO: Starting Chef Run for test1.localdomain
[2016-03-26T22:53:49+00:00] INFO: Running start handlers
[2016-03-26T22:53:49+00:00] INFO: Start handlers complete.
[2016-03-26T22:53:49+00:00] INFO: HTTP Request Returned 404 Not Found: Object not found: 
[2016-03-26T22:53:49+00:00] INFO: HTTP Request Returned 412 Precondition Failed: No such cookbook: apt
 
================================================================================
Error Resolving Cookbooks for Run List:
================================================================================
 
Missing Cookbooks:
------------------
No such cookbook: apt
 
Expanded Run List:
------------------
* my_cookbook::default

OpsWorks 堆栈已配置

自定义食谱回购

为了找到问题的原因,创建了一个食谱,其中包含一个运行 apt-get update 的食谱(在 kitchen converge 下按预期运行)。这些文件是使用 chef generate cookbook my_cookbook:

创建的
.
└── my_cookbook
    ├── Berksfile
    ├── chefignore
    ├── metadata.rb
    ├── README.md
    ├── recipes
    │   └── default.rb
    ├── spec
    │   ├── spec_helper.rb
    │   └── unit
    │       └── recipes
    │           └── default_spec.rb
    └── test
        └── integration
            ├── default
            │   └── serverspec
            │       └── default_spec.rb
            └── helpers
                └── serverspec
                    └── spec_helper.rb

唯一改变的文件是:

my_cookbook/Berksfile

source 'https://supermarket.chef.io'    
metadata    
cookbook 'apt'

my_cookbook/metadata.rb

...
depends 'apt', '~> 3.0.0'

my_cookbook/recipes/default.rb

include_recipe 'apt::default'

此外,Berksfile 已添加到存储库的根目录中

source 'https://supermarket.chef.io'
cookbook 'apt'

当前的解决方法

当前的解决方法包括使用 berks vendor 下载依赖项,然后将下载的说明书复制到存储库的根目录中,即:

.
├── Berksfile
├── apt
└── my_cookbook

是否有更好的解决方案(将 AWS OpsWorks 与 Chef 12 结合使用)不需要使用自定义说明书显式存储和分发社区说明书?

我很确定这就是您现在应该做的。由于我一直不明白的原因,他们删除了 Chef 11 和 Chef 12 堆栈之间的一堆自动化 berks 集成。

我有同样的问题。看起来它应该将 berk pack 与 s3 存储一起使用,但(对我而言)它增加了另一个级别的复杂性(并且仅对 CI 工具有用,其中由 berkshelf 创建的食谱存档会方便'artifact'):

In Chef 12 Linux, Berkshelf is no longer installed on stack instances. Instead, we recommend that you use Berkshelf on a local development machine to package your cookbook dependencies locally. Then upload your package, with the dependencies included, to Amazon Simple Storage Service. Finally, modify your Chef 12 Linux stack to use the uploaded package as a cookbook source. For more information, see Packaging Cookbook Dependencies Locally.

来自 here.

以上问题的答案在此。

检查你的 metadatatab.rb 文件并检查你的 chef 版本,我的情况应该是 12.0 或更高版本。

在执行您的 customcookbooks 之前,更新它并 运行 执行。

一旦你 运行 updatecookbook 检查 /var/chef/cookbook 文件夹并检查你的文件是否存在。

然后 运行 executecookbook。

享受。