我在 CentOS 6 机器上运行 Chef 服务器 11。通过 Opscode 的 RPM 安装。我在 Windows 7 机器上设置了工作站。我可以正常运行knife client list
并获得响应,因此我相信我的服务器运行正常。
我在工作站上创建了一个本地 Git 仓库,添加了入门食谱,并将其提交到本地仓库(在工作站的本地磁盘上)。
但是,当我尝试上传食谱时:
knife cookbook upload getting-started
Uploading getting-started [0.4.0]
ERROR: Method Not Allowed
Response:
“响应”为空。当我尝试时knife cookbook list
,我得到的是空集。我猜想这是因为它正在从服务器获取它,而服务器还没有食谱。
我看见这个帖子在旧的 Opscode wiki 上,这让我相信我正在尝试编辑环境_default
。因此,创建了一个 Dev 环境,确认它存在,然后:
knife cookbook upload getting-started -E Dev
结果相同。我最后的办法是指定一个管理员帐户:
knife cookbook upload getting-started -E Dev -u admin
结果相同。
为了成功上传这本食谱,我需要做什么?
答案1
我在默认安装时也遇到了同样的问题。原来,knife.rb 在服务器 URL 中也需要 https:// 而不是 http://。
答案2
当我尝试从本地 json 文件上传 chef 角色但本地 json 中缺少属性时,我也收到了此错误。当我使用额外详细模式时,我看到 Knife 正在尝试 HTTP PUT 操作并收到响应HTTP 405 Method Not Allowed
。
因此看来,“方法不允许”错误基本上意味着 Knife 提交了 Chef 服务器无法理解的 HTTP 请求。
为了解决我的角色问题,一旦我使用了正确的角色格式(如下所示),它就可以正常工作。
{
"name": "my role name",
"description": "my role description",
"chef_type": "role",
"json_class": "Chef::Role",
"run_list": [
"recipe[recipe1]",
"recipe[recipe2]"
],
"default_attributes": {},
"override_attributes": {}
}
答案3
“方法不允许”错误实际上是HTTP 405错误。我不知道。原来我的 Chef 服务器上有一些奇怪的重定向。我可以通过 FQDN 来寻址服务器,但被重定向到主机名。我打开了“额外”详细程度:
knife cookbook upload getting-started -V -V
调试消息让我知道初始上传获得了 HTTP 301(永久移动)。当 Knife 尝试访问新地址时,它会使用 GET 而不是 POST,从而导致 405。我将 Knife 配置为指向重定向的 URL,上传成功。