我有一本 Chef Cookbook(适用于 apache2)。它在一个节点上无法工作。因此,我尝试对其进行调整和更新,但该节点似乎没有下载新版本。我已能够使用 从本地计算机将所有内容上传到 Chef 服务器knife upload .
,上传成功,并打印出它已上传我更改的 apache2 Cookbook 位。
当我手动(以 root 身份)chef-client
在节点上运行后,我可以看到它正在联系服务器、获取运行列表等。但是配方文件/var/cache/chef/cookbooks/apache2
是旧文件。配方失败(因为它没有我所做的更改)。
如何让节点上的 chef 客户端使用 apache2 cookbook 的新更新版本?我是否需要更改 cookbook 中的版本号(我还没有这样做过)?
chef-client -l debug
输出:
[2015-01-30T10:51:31+01:00] DEBUG: Synchronizing cookbook apache2
[2015-01-30T10:51:31+01:00] DEBUG: Not storing cookbooks/apache2/recipes/mod_ldap.rb, as the cache is up to date.
[2015-01-30T10:51:31+01:00] DEBUG: Not storing cookbooks/apache2/recipes/mod_xsendfile.rb, as the cache is up to date.
[2015-01-30T10:51:31+01:00] DEBUG: Not storing cookbooks/apache2/recipes/mod_auth_openid.rb, as the cache is up to date.
[2015-01-30T10:51:31+01:00] DEBUG: Not storing cookbooks/apache2/recipes/mod_setenvif.rb, as the cache is up to date.
[2015-01-30T10:51:31+01:00] DEBUG: Not storing cookbooks/apache2/recipes/mod_python.rb, as the cache is up to date.
[2015-01-30T10:51:31+01:00] DEBUG: Not storing cookbooks/apache2/recipes/mod_authz_host.rb, as the cache is up to date.
[2015-01-30T10:51:31+01:00] DEBUG: Not storing cookbooks/apache2/recipes/mod_proxy_ajp.rb, as the cache is up to date.
[2015-01-30T10:51:31+01:00] DEBUG: Not storing cookbooks/apache2/recipes/mod_expires.rb, as the cache is up to date.
(lots of this for all files)
我是厨师新手,所以我可能犯了一个初学者的错误。
答案1
我能想到的几件事可能会对你有帮助。
验证您上传的食谱版本是否是最新版本
Cookbook 版本控制的一个常见问题是,您可能正在本地修改 Cookbook 版本 1.0.0 并上传,但 Chef Server 已将 Cookbook 版本 1.0.1 上传到其中。在这种情况下,Chef Clients 通常会检索最新版本(除非另有说明),并且您的更改永远不会同步到本地缓存。
您可以通过以下方式查看 Chef Server 上食谱的所有当前版本:
knife cookbook show apache2
解决此问题的一个方法就是您提到的方法 - 将版本号增加到 Chef Server 上现有的版本号以上,即 1.0.2 并上传。
另一种方法是从 Chef Server 中删除任何其他 apache2 cookbook,然后重新上传所需的 apache2 cookbook。这不需要任何版本号更新,最终结果是 Chef Server 将只有一个 apache2 cookbook。
验证你的更改确实已发送到 Chef Server
使用
knife cookbook show apache2 <cookbook version> recipes default.rb
替换版本、路径和文件名 - 例如,如果您想查看名为 foo.erb 的模板:knife cookbook show apache2 0.1.0 templates foo.erb
此命令将从 Chef 服务器请求文件并在终端中显示输出。这是确定您所做的更改正在通过 上传的简单方法
knife cookbook upload
。
除此之外,如果这没有帮助,添加knife
版本、chef-server
版本、chef-client
版本的详细信息以及调试日志knife cookbook upload apache2 -VV
将有助于进一步调试。
答案2
首先在服务器上调试所有版本的食谱,然后检查客户端正在下载哪个版本的食谱。如果是旧的,只需检查服务器是否有更新版本。如果也是,请转到 chef 服务器 UI 并检查环境。您可能已经设置了一个指定了食谱约束的环境。请在那里更新版本,它将再次开始工作。
答案3
另一个原因可能是 chef-server 上并非所有的 cookbook 依赖项都存在。我刚刚遇到了这个问题,我的 cookbook 的新版本出现了,knife cookbooks list
但我的客户端没有使用新版本。经过一些调试,我发现 Berkshelf 和 knife 都没有上传我的 cookbook 的新依赖项。在我上传之后,客户端开始使用较新的版本。