Chef infra 厨师长客户端无法使用berkshelf找到食谱

Chef infra 厨师长客户端无法使用berkshelf找到食谱,chef-infra,berkshelf,Chef Infra,Berkshelf,我是厨师新手,遇到了伯克希尔和厨师客户的问题。我想有我自己的食谱与依赖性,并应用它。我最初的食谱是这样的: . ├── Berksfile ├── Berksfile.lock ├── chefignore ├── client.rb ├── Gemfile ├── Gemfile.lock ├── metadata.rb ├── README.md └── recipes    └── default.rb #./Berksfile source 'https://supermarket.

我是厨师新手,遇到了伯克希尔和厨师客户的问题。我想有我自己的食谱与依赖性,并应用它。我最初的食谱是这样的:

.
├── Berksfile
├── Berksfile.lock
├── chefignore
├── client.rb
├── Gemfile
├── Gemfile.lock
├── metadata.rb
├── README.md
└── recipes
    └── default.rb

#./Berksfile
source 'https://supermarket.getchef.com'

metadata

cookbook 'znc'


#./client.rb
cookbook_path '~/.berkshelf/cookbooks'
source 'https://supermarket.chef.io'
metadata
#!/usr/bin/env bash
cat <<-EOF > Berksfile
source 'https://supermarket.chef.io'
$(grep -Rh 'depends' cookbooks/* | sed 's/depends/cookbook/')
EOF

berks vendor
当我运行sudo bundle exec chef client-z-o znc--config=client.rb时,chef客户端找不到烹饪书:

Starting Chef Client, version 11.16.4
[2014-10-25T15:34:59+02:00] WARN: Run List override has been provided.
[2014-10-25T15:34:59+02:00] WARN: Original Run List: []
[2014-10-25T15:34:59+02:00] WARN: Overridden Run List: [recipe[znc]]
resolving cookbooks for run list: ["znc"]

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

Missing Cookbooks:
------------------
No such cookbook: znc

Expanded Run List:
------------------
* znc


Running handlers:
[2014-10-25T15:34:59+02:00] ERROR: Running exception handlers
Running handlers complete
[2014-10-25T15:34:59+02:00] ERROR: Exception handlers complete
[2014-10-25T15:34:59+02:00] FATAL: Stacktrace dumped to /home/sebastian/.chef/local-mode-cache/cache/chef-stacktrace.out
Chef Client failed. 0 resources updated in 3.474758165 seconds
[2014-10-25T15:34:59+02:00] ERROR: 412 "Precondition Failed "
[2014-10-25T15:34:59+02:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
另请注意:

ls ~/.berkshelf/cookbooks 
build-essential-2.1.2  znc-0.0.1
为什么找不到食谱,有什么建议吗

编辑: 谢谢你的快速回答。解决方案正如John Bellone对bundle exec berks供应商所说的那样,并将我的
client.rb
配置更改为:

# ./client.rb
cookbook_path File.dirname(File.expand_path(__FILE__)) + '/berks-cookbooks'

默认情况下,Chef客户端将查找一些目录。其中一个是
$CWD/cookbooks
,我们可以利用
berks-vendor-cookbooks
命令。我发现在我的测试过程中这样做要容易得多(尤其是使用自动化过程),因为它确保我得到一份新的烹饪书,而不是一份缓存的、陈旧的


如果您希望简单地启动并运行一个环境,我建议您在插件中使用Vagrantfile。这将自动提供缓存目录中的所有烹饪书,并将其上载到来宾计算机。如果您使用的提供商是云提供商,例如Amazon,Backspace,它甚至可以工作,因为它将使用rsync而不是共享目录

我正在使用下面的脚本,这允许我对我的食谱使用git-repo,这些食谱依赖于超市中的食谱,但没有厨师服务器。将以下内容放入名为“本地厨师客户端”的文件中,该文件的级别与cookboks目录相同。然后,您可以将本地计算机与
/local chef client“recipe[some::default]”
聚合

#!/bin/bash
cmd="berks vendor -b $(pwd)/cookbooks/Berksfile"
pushd /tmp
rm -rf cookbooks
$cmd
mv berks-cookbooks cookbooks
sudo chef-client -z  -r "$@"
popd

全部归功于@revau。这是我的答案,因为我只做了几处调整供自己使用。这可能需要Berkself的某个版本,但我看到的所有文档都暗示您可以在最后使用“PATH”来告诉它将依赖项放在哪里。这还显式地清除了之后的
$tmpdir
,因为一些文件在运行时最终归root所有

我使用路径运行此命令,该路径指向具有
/local chef client my_cookbook_name
/local chef client path/to/chef repos/specific_repo
的任何chef cookbook repo,路径由
pwd-p
解析,
cookbook
是脚本中引用的
$1
基本名称

#!/bin/bash -x
: ${1:?"Usage: $0 ./path/to/cookbook [doit]"}
case $1 in
 .) cookbook=$(basename $(pwd -P $1));repodir=$(dirname $(pwd -P $1));;
 *) cookbook=$(basename $1);repodir=$(pwd -P $1);;
esac
case $2 in
 doit) whyrun="";;
 *) whyrun="-W ";;
esac
realcookbook=$(grep '^name' $repodir/$cookbook/metadata.rb | sed "s/'//g" | awk '{ print $2 }')
# echo "cookbook is $cookbook"
# echo "realcookbook is $realcookbook"
# echo "repodir is $repodir"
cmd="berks vendor -b $repodir/$cookbook/Berksfile cookbooks"
tmpdir=$(mktemp -d)
pushd $tmpdir
$cmd
sudo chef-client $whyrun -z -o "$realcookbook"
popd
sudo rm -rf $tmpdir
if [ ! "${whyrun}x" == "x" ]; then echo "Append 'doit' after the recipe name to really apply, eg $0 $1 doit"; fi
这应该可以处理有人从回购协议内部运行它的情况,或者几乎任何通向回购协议的路径。总有一天我会写一些BATS测试来证明这一点,但现在它工作得非常出色


我更新了它,以处理与cookbook名称不匹配的文件夹,以防存储库名称不匹配或有人克隆到自定义路径。实际上,有人在我的指导下尝试了这一点,然后我不得不深入到厨师那里,找出它不起作用的原因,结果发现文件夹名称比菜谱/食谱名称更重要。

对于本地开发,本地模式查找
配置.rb
刀.rb
,从以下顺序开始,
$shone\u HOME
$PWD
.chef/
,最后是
$HOME/.chef/
*

  • 源代码:
    chef-config-13.8.5
    gem中的
    lib/chef-config/workstation\u-config\u-loader.rb
    chef-13.8.5
    gem中的
    load\u-config\u-file()
    方法调用
~/.berkself/cookbooks
cookbook\u路径
无效,原因有二:(1)首先,您只能从命令行使用
~
,从ruby中使用
ENV['HOME']
,以及(2)该位置有版本化的cookbooks,例如
foo-0.4.6
,当chef run查找
foo
时,无法解决此问题

对于本地模式,在运行
berks供应商
后,必须在保存的地方下载烹饪书,例如本地
berks烹饪书
dir。如果您使用当前的chef13模式使用
metadata.rb
,那么您必须从您的菜谱元数据中获取对超市菜谱的所有引用,将其放入主
Berksfile
,然后是供应商菜谱,然后从您的配置(
knife.rb
)中引用此新的
berks菜谱

具有Berks模式的元数据 在您自己的食谱中,
metadata.rb
as取决于行,例如:

depends 'hostsfile', '~> 3.0.1'
Berksfile
将引用以下内容:

.
├── Berksfile
├── Berksfile.lock
├── chefignore
├── client.rb
├── Gemfile
├── Gemfile.lock
├── metadata.rb
├── README.md
└── recipes
    └── default.rb

#./Berksfile
source 'https://supermarket.getchef.com'

metadata

cookbook 'znc'


#./client.rb
cookbook_path '~/.berkshelf/cookbooks'
source 'https://supermarket.chef.io'
metadata
#!/usr/bin/env bash
cat <<-EOF > Berksfile
source 'https://supermarket.chef.io'
$(grep -Rh 'depends' cookbooks/* | sed 's/depends/cookbook/')
EOF

berks vendor
创建主Berksfile 您需要创建一个
Berksfile
,该文件引用
cookbooks/
目录中的所有依赖项。我在chef repo级别使用的shell脚本如下所示:

.
├── Berksfile
├── Berksfile.lock
├── chefignore
├── client.rb
├── Gemfile
├── Gemfile.lock
├── metadata.rb
├── README.md
└── recipes
    └── default.rb

#./Berksfile
source 'https://supermarket.getchef.com'

metadata

cookbook 'znc'


#./client.rb
cookbook_path '~/.berkshelf/cookbooks'
source 'https://supermarket.chef.io'
metadata
#!/usr/bin/env bash
cat <<-EOF > Berksfile
source 'https://supermarket.chef.io'
$(grep -Rh 'depends' cookbooks/* | sed 's/depends/cookbook/')
EOF

berks vendor
可选(本地开发人员与chef服务器) 最后,有许多方法可以将本地开发人员与chef服务器工作流分开。就我个人而言,我使用git子模块,其中chef repo位于它自己的git repo中,它具有自己的
.chef
(位于
.gitignore
中,因为它具有使用chef服务器的凭据)


在我的开发环境中,我有一个子目录
${orgname}-chef repo
和我的本地开发人员
.chef/knife.rb
配置为使用
berks cookbooks
。当我
cd${orgname}-chef repo
时,我运行shell脚本,创建
Berksfile
berks cookbooks
目录,然后运行
berks install
,使用本地凭据将所有依赖项上传到服务器。然后
cd..
回到我的本地开发环境,用vagrant、knife zero和其他工具做本地开发工作。

感谢您解释默认的
$CWD/cookbooks
。我得到了同样的
没有这样的烹饪书
错误,但原因与这里的问题不同。我的文件夹名有一个输入错误。它是单数而不是复数的
cookbook
!(教统局)