我正在尝试学习厨师,并按照此处{chef {3}}
的厨师独奏文档进行操作在以下环境中运行chef-solo时:
name "dev"
description "Development Environment"
cookbook "vim-tutorial"
我得到以下stacktrace:
ArgumentError:参数数量错误(1表示2) /opt/chefdk/embedded/apps/chef/lib/chef/environment.rb:107:in
cookbook' /Users/barleyj/.chef/chef-solo/environments/dev.rb:3:in
from_file' 在/ {/ 1 /} /opt/chefdk/embedded/apps/chef/lib/chef/environment.rb:261:ininstance_eval' /opt/chefdk/embedded/apps/chef/lib/chef/mixin/from_file.rb:30:in
loading' /opt/chefdk/embedded/apps/chef/lib/chef/node.rb:380:inload_from_file' /opt/chefdk/embedded/apps/chef/lib/chef/environment.rb:241:in
展开!' /opt/chefdk/embedded/apps/chef/lib/chef/policy_builder/expand_node_object.rb:135:inapply_expansion_attributes' /opt/chefdk/embedded/apps/chef/lib/chef/node.rb:369:in
build_node' /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:259:inexpand_run_list' /opt/chefdk/embedded/apps/chef/lib/chef/policy_builder/expand_node_object.rb:122:in
do_run' /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:213:inbuild_node' /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:420:in
fork' /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:207:inblock in run' /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:207:in
run_chef_client' /opt/chefdk/embedded/apps/chef/lib/chef/application/solo.rb:226:inrun' /opt/chefdk/embedded/apps/chef/lib/chef/application.rb:236:in
循环' /opt/chefdk/embedded/apps/chef/lib/chef/application/solo.rb:218:inblock in run_application' /opt/chefdk/embedded/apps/chef/lib/chef/application/solo.rb:218:in
运行' / opt / chefdk / embedded / apps / chef / bin / chef-solo:25:run_application' /opt/chefdk/embedded/apps/chef/lib/chef/application.rb:55:in
加载' / usr / bin / chef-solo:33:在`'
当我查看environment.rb中的源代码时,这是有道理的。 cookbook方法只接受2个参数。
如果我将版本添加到环境文件中:
<top (required)>'
/usr/bin/chef-solo:33:in
Chef :: Exceptions :: IllegalVersionConstraint:大厨独奏中不允许使用环境食谱版本限制 /opt/chefdk/embedded/apps/chef/lib/chef/environment.rb:306:in
name "dev" description "Development Environment" cookbook "vim-tutorial", "= 0.1.0"
在食谱中阻止&#39; /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:224:invalidate_cookbook_version' /opt/chefdk/embedded/apps/chef/lib/chef/environment.rb:112:in
阻止_pv_callbacks&#39; /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:223:incall' /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:224:in
_ pv_callbacks&#39; /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:70:ineach' /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:223:in
每个&#39; /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:67:inblock (2 levels) in validate' /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:67:in
每个&#39; /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:57:inblock in validate' /opt/chefdk/embedded/apps/chef/lib/chef/mixin/params_validate.rb:57:in
cookbook&#39; /Users/barleyj/.chef/chef-solo/environments/dev.rb:3:invalidate' /opt/chefdk/embedded/apps/chef/lib/chef/environment.rb:108:in
instance_eval&#39; /opt/chefdk/embedded/apps/chef/lib/chef/mixin/from_file.rb:30:infrom_file' /opt/chefdk/embedded/apps/chef/lib/chef/mixin/from_file.rb:30:in
load_from_file&#39; /opt/chefdk/embedded/apps/chef/lib/chef/environment.rb:241:infrom_file' /opt/chefdk/embedded/apps/chef/lib/chef/environment.rb:261:in
apply_expansion_attributes&#39; /opt/chefdk/embedded/apps/chef/lib/chef/node.rb:369:inload' /opt/chefdk/embedded/apps/chef/lib/chef/node.rb:380:in
expand_run_list&#39; /opt/chefdk/embedded/apps/chef/lib/chef/policy_builder/expand_node_object.rb:122:inexpand!' /opt/chefdk/embedded/apps/chef/lib/chef/policy_builder/expand_node_object.rb:135:in
build_node&#39; /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:420:inbuild_node' /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:259:in
阻止运行&#39; /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:207:indo_run' /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:213:in
运行&#39; /opt/chefdk/embedded/apps/chef/lib/chef/application.rb:236:infork' /opt/chefdk/embedded/apps/chef/lib/chef/client.rb:207:in
块在run_application&#39; /opt/chefdk/embedded/apps/chef/lib/chef/application/solo.rb:218:inrun_chef_client' /opt/chefdk/embedded/apps/chef/lib/chef/application/solo.rb:226:in
run_application&#39; /opt/chefdk/embedded/apps/chef/lib/chef/application.rb:55:inloop' /opt/chefdk/embedded/apps/chef/lib/chef/application/solo.rb:218:in
&#39; / usr / bin / chef-solo:33:run' /opt/chefdk/embedded/apps/chef/bin/chef-solo:25:in
&#39;
当我查看源代码时,这也是有意义的,因为它不允许版本约束。那么如何在没有厨师服务器的情况下安装食谱或食谱呢?
答案 0 :(得分:2)
Chef客户端版本11+,具有名为Chef client local mode(-z)的选项 这是在没有Chef服务器的情况下运行cookbook的最佳方式。
Chef-client的Chef文档声明如下,
$ chef-client OPTION VALUE OPTION VALUE ...
-z, --local-mode
Run the chef-client in local mode. This allows all commands that work against the Chef server to also work against the local chef-repo.
文档还说明了Chef Local Mode,
本地模式不需要配置文件,而是看起来 对于名为
/cookbooks
的目录,将chef_repo_path
设置为 就在那之上。 (本地模式将遵循a中的设置 配置文件,如果需要。)如果找不到client.rb
文件 并且没有指定配置文件,本地模式将搜索aknife.rb
档案。本地模式将存储临时文件和缓存文件 默认情况下为
<chef_repo_path>/.cache
目录。这允许正常 用户在本地模式下运行chef-client而不需要root 访问。
请按照以下说明进行操作
chef-client -z -o&#39; provide_your_overridden_runlist&#39;
进一步参考here
答案 1 :(得分:0)
完全取消cookbook
位。该功能不能与chef-solo
一起使用,因为它不会执行任何形式的版本解析。我想也许你假设食谱版本限制作为某种运行列表,但事实并非如此。只有角色(和节点)可以有一个运行列表。你可以做的是一个角色可以拥有一个特定环境的不同运行列表,覆盖正常环境。
答案 2 :(得分:0)
您可以使用chef-solo。我将运行列表放在 node.json(使用 -j 标志)文件中,该文件与环境、cookbooks 和 data_bags 目录位于同一位置。您可以使用 tarball(如他们的文档中所述),但我发现在节点上压缩、scp 和解压缩同样容易。
我使用单独的说明书来管理 Berksfile 中的所有说明书、内部和 3rd 方,然后使用 berks vendor
将它们全部打包到同一个文件夹中(不是我的内部说明书文件夹,因为它抓取了内部食谱相同)。这是发送到节点的目录。
Chef-solo 从节点中删除了在初始运行时未列为依赖项的所有食谱,因此您只需要在适当的元数据文件中列出所有依赖项。它执行递归搜索,因此如果 cookbookA 使用 cookbookB 而 cookbookB 使用 cookbookC,则以下内容就足够了:
# cookbookA/metadata.rb
depends 'cookbookB', '~> 0.1.0'
# cookbookB/metadata.rb
depends 'cookbookC', '~> 0.1.0'