【发布时间】:2015-02-06 12:05:01
【问题描述】:
我有几台 ubuntu 机器需要进行相同的配置,因此我在共享目录中使用 chef-solo 对厨师食谱进行了只读安装来完成此操作。我已经使用 chef-solo 一年多了,从 chef 版本 10 开始。今天,在使用 packer 重建 VM 之后(我使用 VM 来测试我的食谱,然后在“真实”机器上使用它们,并定期重建它们所以是“新鲜的”)我的食谱开始因错误而失败:
ERROR: Cookbook loaded at path(s) [/chef/cookbooks/ack-grep] has invalid metadata: The `name' attribute is required in cookbook metadata
我在几台机器上多次使用这些食谱,在虚拟机中反复测试,但我注意到新重建的虚拟机安装了 chef 12.0.0。运行 chef 11 的旧 VM 仍然可以正常工作。这适用于我的每一本食谱。
我开始使用谷歌调查和研究这个问题,我在这个主题上找到的所有内容都说将“名称”条目放在 metadata.rb 文件中。但是我的 metadata.rb 文件已经包含一个“名称”条目。例如,这是我的元数据文件(经过编辑以不将我的个人信息全部放在可用于 google 的论坛中):
---- Begin metadata.rb ---------
name 'ack-grep'
maintainer 'me'
maintainer_email 'me@example.com'
license 'All Rights Reserved'
description 'Installs/Configures ack-grep'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version '0.1.0'
------ End metadata.rb -------
这本食谱中的单一食谱非常简单:
-------- 开始 default.rb --------
# # Cookbook Name:: ack-grep # Recipe:: default package 'ack-grep' do action :install end----- 结束 default.rb --------
我在研究时读到的一篇文章说创建 metadata.json 文件会有所帮助,所以我运行了命令:
刀菜谱元数据 ack-grep
此命令创建了一个 metadata.json 文件,其中包含一个类似的“名称”字段,该字段具有与 metadata.rb 文件相同的信息以及许多其他信息,均采用 json 格式。但是再次运行相同的 chef-solo 命令会导致完全相同的错误消息。
我猜测,由于它抱怨元数据中缺少一个字段,该字段存在于 metadata.rb 和 metadata.json 文件中,因此我缺少其他内容并且错误消息是错误的。任何人都有比这更好的信息,或者知道发生了什么?也许甚至如何绕过/修复它?
【问题讨论】:
-
嗨,你能在 Vim 中打开 metadata.rb 文件并检查任何非打印字符吗? stupidunixlinuxtricks.blogspot.com/2008/03/…
-
还要检查文件同步是否正常。通常,您不希望在工作时将 metadata.json 放在文件夹中,因此我建议您将其删除。
-
欧文,我按照你的建议做了,但遗憾的是,除了换行符外,没有显示不可打印的字符。所有的空间实际上都是空间。
-
coderanger,我删除了 metadata.json 文件。文件同步甚至在 chef-solo 中发挥作用吗?感谢您的帮助。
标签: metadata chef-infra chef-solo