无法在 AWS Opsworks 上使用 Chef 12 查找 Chef 社区食谱

Posted

技术标签:

【中文标题】无法在 AWS Opsworks 上使用 Chef 12 查找 Chef 社区食谱【英文标题】:Failing To Find Chef Community Cookbooks Using Chef 12 On AWS Opsworks 【发布时间】:2016-07-14 12:46:07 【问题描述】:

问题

在 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 堆栈已配置

厨师 12 使用自定义 Chef 食谱 为自定义说明书使用 Git 存储库

自定义食谱回购

为了找到问题的原因,创建了一个食谱,其中包含一个运行 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 被添加到 repo 的根目录

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

当前的解决方法

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

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

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

【问题讨论】:

【参考方案1】:

这是上述问题的答案。

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

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

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

然后运行 ​​executecookbook。

享受吧。

【讨论】:

感谢您的回复。但是,我不清楚这如何回答这个问题。您能否澄清一下在使用 OpsWorks 时如何自动下载社区食谱 - 无需通过 SSH 连接到 EC2 实例来执行一些手动干预。 是的,我们可以自动化 EC2 实例,但在我们需要使用 aws configure 将 ec2 机器添加到 opswork 之前。并且还安装了 opswork 客户端。 感谢您的尝试。但问题的解决方案(如提出的)在答案或评论中并不明显。 但对我来说,这是一个准确的答案,它也解决了我的问题。【参考方案2】:

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

在 Chef 12 Linux 中,Berkshelf 不再安装在堆栈实例上。相反,我们建议您在本地开发机器上使用 Berkshelf 在本地打包您的说明书依赖项。然后将包含依赖项的包上传到 Amazon Simple Storage Service。最后,修改您的 Chef 12 Linux 堆栈以使用上传的包作为食谱源。有关详细信息,请参阅本地打包 Cookbook 依赖项。

来自here。

【讨论】:

【参考方案3】:

我很确定你现在应该这样做。由于我从未理解的原因,他们删除了 Chef 11 和 Chef 12 堆栈之间的一堆自动化 berks 集成。

【讨论】:

您可以完全确定。运行 Chef 12 的 Opsworks 不支持 Berkshelf。

以上是关于无法在 AWS Opsworks 上使用 Chef 12 查找 Chef 社区食谱的主要内容,如果未能解决你的问题,请参考以下文章

从 AWS Opsworks Stacks Chef 11 迁移到 Chef 12 - 堆栈属性问题

特定的 nodejs 版本,opsworks_ruby,aws,chef 12

Opsworks Chef 无法创建 cron

AWS Opsworks 中的 Chef 环境

如何在 MacOS 中安装 chef 12 以部署到 AWS Opsworks?

使用 Chef 12 从 AWS OpsWorks 中的堆栈设置获取自定义 JSON