简介 我正在学习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::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方式",所以我创造了一本新的食谱。
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 install
并运行它:
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 **
我在亚马逊上启动了CentOS 6.5 EC2实例,安装了Ruby 2.1.3和Chef。 创建了一个〜/ chef-repo / cookbooks文件夹
我使用berkshelf创建了一本食谱,然后运行
bundle install
添加了其他替代品中的参考/代码 然后
berks install
并按照我上次的方式运行。
我遇到了同样的问题。
我错过了什么?我需要做些什么才能使用它?
答案 0 :(得分:17)
确保按照docs中的说明配置了chef_repo_path
。
基本上local-mode
需要知道在哪里可以找到您的食谱,角色,环境,数据包等。遗憾的是,文档并不是非常清楚您在何处/如何设置chef_repo_path
这是我从代码中可以看到的内容。
client.rb
且包含cookbook_path
,chef_repo_path
= "#{cookbook_path}/.."
knife.rb
且包含cookbook_path
,chef_repo_path = "#{cookbook_path}/.."
pwd
向上搜索,查找名为cookbooks
的目录。如果找到,则cookbooks/..
将被设置为chef_repo_path。pwd
将用作chef_repo_path
如果你正在使用Berkshelf,最好的办法是做一个berks vendor
,以获得你需要的所有食谱的单个目录。然后,您可以将chef_repo_path指向保存您所售食谱的cookbooks
目录的父目录。
请注意,这是从挖掘源代码的10分钟开始,所以我可能没有完全正确。
答案 1 :(得分:2)
在寻找本地运行测试的同时,我遇到了同样的问题"无法解决食谱问题"错误。由于我可能希望在没有Chef服务器的情况下运行cookbook,但也没有安装ChefDK,非厨师开发人员可以进行简单的一次性工作站设置,我将以下工作流程放在一起。
您的食谱需要存放在名为cookbook的文件夹下,这似乎是硬编码的"魔术",但它似乎能够在任何地方生活,例如userdir/projects/cookbooks/my_cookbook_name/
。
如果您有依赖项的Berksfile,则需要先运行它们才能运行chef-client -z -o my_cookbook_name
,然后运行berks vendor
将依赖项拉入当前文件夹中的cookbooks
目录。
berks vendor
命令将您的其他依赖项拉入cookbooks目录,因此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
使用内置于客户端的新厨师零的美妙之处在于,您不一定需要完整的ChefDK进行测试,尽管在至少一台机器上需要berkshelf用于berks命令ChefDK是一场噩梦。获得berks
之后,您可以运行berks package
并将其创建的文件复制到仅使用chef-client的计算机并将其添加到某处,然后在包含{的目录中运行chef-client -z -o your_cookbook
{1}}文件夹。
为了让厨师使用omnibus安装程序,你就足以引导节点或运行配方。
cookbooks
如果你需要你的berks并希望快速获得ChefDK,那么这就可以了。
. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chef
答案 2 :(得分:1)
经过几个小时的尝试,尝试将@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
旁边的最后一个斜杠(" \")也很重要。
答案 3 :(得分:0)
另一个选项:当您在角色/食谱名称中输入错字时,也会出现以下错误。
Missing Cookbooks:
------------------
The following cookbooks are required by the client but don't exist on the server:
* some-cookbook-name
一旦您将菜谱上传到厨师服务器,请确保在运行列表中使用正确的名称例如:
$ 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