无法在本地模式下解决厨师外部食谱依赖性

roi*_*uez 4 chef chef-zero

我正在厨师做我的第一个食谱。我创建了一本我称之为 common 的食谱,只有一个食谱(default.rb):

apt_repository "mariadb-repo" do
  uri "http://tedeco.fi.upm.es/mirror/mariadb/repo/10.1/ubuntu"
  distribution "trusty"
  components ["main"]
  arch "amd64"
  keyserver "keyserver.ubuntu.com"
  key "CBCB082A"
end
Run Code Online (Sandbox Code Playgroud)

我在 metadata.rb 的末尾添加了“depends 'apt'”。如果我运行:

Starting Chef Client, version 12.5.1
resolving cookbooks for run list: ["common"]

================================================================================
Error Resolving Cookbooks for Run List:
================================================================================

Missing Cookbooks:
------------------
No such cookbook: apt

Expanded Run List:
------------------
* common


Running handlers:
[2016-01-28T13:07:17+00:00] ERROR: Running exception handlers
Running handlers complete
[2016-01-28T13:07:17+00:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated in 01 seconds
[2016-01-28T13:07:17+00:00] FATAL: Stacktrace dumped to /home/vagrant/.chef/local-mode-cache/cache/chef-stacktrace.out
[2016-01-28T13:07:17+00:00] ERROR: 412 "Precondition Failed"
[2016-01-28T13:07:17+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Run Code Online (Sandbox Code Playgroud)

好的,所以我添加到我的 Berksfile 中:

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

cookbook 'apt'

metadata
Run Code Online (Sandbox Code Playgroud)

然后尝试将 apt 食谱安装到几个位置:

$ berks install # installs to ~/.berkshelf/cookbooks/
$ berks vendor --except=common berks-cookbooks/
Run Code Online (Sandbox Code Playgroud)

我注意到的第一件事是第二个命令将食谱、apt 和我的 common 都打包到我指定的目录中(甚至传递 --except=common)。没关系:如果我现在尝试运行:

$ sudo chef-client --local-mode --runlist 'recipe[common]'
Run Code Online (Sandbox Code Playgroud)

从我的食谱(我称之为 common)目录和 berks-cookbooks 目录中。两者都不起作用,上面的错误仍然存​​在。我还尝试在我的食谱目录中使用以下 client.rb:

cookbook_path = "./berks-cookbooks"
chef_repo_path = "#{cookbook_path}"
Run Code Online (Sandbox Code Playgroud)

还有这些的一些变体……

我错过了什么?在本地模式下,chef-client 正确满足这些依赖关系的方法是什么?

满足这种依赖关系的方法是什么?

'''EDIT 1''':不使用 sudo 运行不起作用。

cod*_*ger 7

本地模式下的 Chef 客户端读取knife.rb其配置文件,而不是client.rb. 当在工作站上使用它时,这是有道理的,比如 Chef-provisioning,但当你尝试在生产中使用 local-mode 时,这可能会出乎意料。

通常,您应该使用本地模式berks vendor来处理导出。与其chef-client从 Cookbook(s) 文件夹运行,不如创建一个/root/local_mode_repo或类似的文件,然后运行berks vendor /root/local_mode_repo/cookbooks. 然后您可以chef-client --local-mode在该文件夹内运行。存储库中的特定文件夹名称类似roles/并且cookbooks/通常不可配置。