我正在寻找有关厨师食谱版本管理的想法。我知道您在环境中固定了特定版本,但我不确定如何去做。
我们使用librarian-chef 将第3 方社区书籍安装到cookbooks 文件夹中。我们从不碰这些书,只是不时更新到最新版本。
我们还提供自定义站点特定食谱,其中包含社区食谱 ( include_recipe)。
理论上我们可以指定自定义书籍所依赖的社区书籍的特定版本,然后在环境配置中设置我们的食谱版本,但问题是这些社区书籍可能依赖于其他一些没有指定版本的书籍。并且这种深度嵌套的依赖可能会持续下去。
因此,无法保证当您将食谱上传到厨师服务器时,它不会破坏产品,因为依赖的食谱也可能会发生变化。
目前我能看到的唯一解决方案是指定我们在环境配置中使用的每个食谱版本,包括社区和自定义版本。但后来我必须仔细阅读每本食谱并找出那些版本。
我们还不时进行图书管理员-厨师更新,我想可能会很难追踪更改的版本,并且在时间到来时不要忘记更新环境中的版本。
请分享您的经验和最佳实践。我相信它对其他人非常有用。
我的情况是,Chef 可能会启动一项服务 (postgres),但随后可能会在带外停止。我想要一个后续的 Chef 运行来导致服务运行。我试过这个:
service "postgresql" do
action :start
end
Run Code Online (Sandbox Code Playgroud)
但它没有效果,(up to date)大概是因为 Chef 知道它已经启动并且无法判断它已经停止。(可能是由于service ... status此服务的行为方式?)如果我这样写:
# anti-pattern warning!
execute "force-start-postgresql" do
command "service postgresql start || /etc/init.d/postgresql start"
action :run
end
Run Code Online (Sandbox Code Playgroud)
我得到了想要的行为。也action :restart让它运行。然而,由于可移植性,这些看起来像是反模式(并且在后一种情况下可能会在再次启动之前停止它)。
那么,我如何告诉 Chef 强制启动该服务,即使它认为它已经在运行呢?
这是使用由 OpsCode 托管的 Chef 11.6 和默认的 postgresql 配方。(注意这很相似,但我认为与如何在 Chef 中强制对“最新”资源执行操作不完全相同?。)
---编辑(在 jtimberland 帖子后澄清)---
在-l debug这里显示:
DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running
Run Code Online (Sandbox Code Playgroud)
即使它没有运行。所以这听起来像是一个错误,我对此很感兴趣。但是,我主要对是否有办法告诉厨师“始终调用服务启动命令,跳过状态检查”感兴趣。这就是这里的问题。
(我不是专家,但我认为确保服务运行的最便携方法是启动服务,这几乎总是幂等的。OTOH检查 …
我想在厨师食谱中做这样的事情:
maven_artifact "/opt/foo/my.jar" do
source "com.foo:my:0.1:jar"
end
Run Code Online (Sandbox Code Playgroud)
但是我找不到提供此功能的食谱。我写了一些基本上做到这一点的东西,但它不处理快照,这需要解析 maven-metadata.xml。在我深入研究之前,我想确保我没有遗漏一些明显的东西,因为这似乎是一个基本的用例。
我了解在多服务器环境中使用 Chef 和 puppet 的优势。它非常适合在许多服务器上执行和描述配置。
但是假设您只有一台服务器,chef-solo与简单地手动配置服务器相比,您有什么优势?我喜欢厨师,但我想不出为什么花时间设置厨师独奏值得在单个甚至两个服务器架构上麻烦,但显然人们这样做了。
我有一本厨师食谱(适用于 apache2)。它无法在一个节点上工作。所以我试图调整它并更新它,但节点似乎没有下载新版本。我已经能够将所有内容从我的本地机器上传到厨师服务器knife upload .,成功,并打印出它上传了我更改的 apache2 食谱位。
当我chef-client在节点上手动运行(以 root 身份)时,我可以看到它与服务器联系,获取运行列表等。但是,其中的配方文件/var/cache/chef/cookbooks/apache2是旧文件。配方失败了(因为它没有我所做的更改)。
如何让节点上的 Chef 客户端使用 apache2 食谱的新更新版本?我需要在食谱中修改版本号吗(我没有这样做过)?
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 …Run Code Online (Sandbox Code Playgroud) 调用厨师独奏的惯用方式是什么?大多数网站都是这样做的:
chef-solo -c ~/solo.rb -j ~/node.json -r http://www.example.com/chef-solo.tar.gz
Run Code Online (Sandbox Code Playgroud)
但这很长。我可以想到一些更短的方法来做到这一点:
rake chef-solo)。run-chef-solo)。chef-solo)。这样做的惯用方法是什么?其他厨师用户如何调用厨师?
当您使用 Chef 的加密数据包功能时,您如何将密钥部署到许多服务器?如果您将其放入菜谱,任何有权访问任何厨师服务器或客户端的人都可以提取密钥并可能解密任何数据包。
您如何确保密钥位于需要它的机器上,同时又不会被任何人窥探?
当该属性没有合理的默认值时,在资源(如模板)中使用属性的推荐方法是什么。期望在运行时提供属性值。如果不是,厨师食谱执行应该出错。
我现在拥有的方式是将属性值应用于模板时为空字符串。
/食谱/default.rb
template "/var/tmp/my_script.sh" do
source "my_script.erb"
mode "0755"
variables({
:url => node['environment']['url']
})
end
Run Code Online (Sandbox Code Playgroud)
/templates/default/my_script.erb
#!/bin/bash
echo "The url is: <%= @url %>"
Run Code Online (Sandbox Code Playgroud)
生成的 /var/tmp/my_script.sh 文件如下所示:
#!/bin/bash
echo "The url is: "
Run Code Online (Sandbox Code Playgroud)
但我希望它会出错。有什么建议吗?
有人可以向我解释厨师是如何工作的吗?这是一个相当广泛的问题,所以为了缩小范围,我有一个非常简单的方法,它循环遍历用户列表并创建每个用户(如果它们尚不存在)。这是行不通的。
据我所知,循环似乎正如我所期望的那样发生。一旦循环完成了我创建每个用户的 bash 命令,循环中的每次迭代都会执行一次。然而,当 bash 命令被执行时,它们似乎只有来自第一次循环迭代的用户值。
编写类似于此示例的循环变量数据的配方的正确方法是什么?
这是食谱:
node[:users].each do |user|
puts "in loop for #{user['username']}"
bash "create_user" do
user "root"
code do
puts "running 'useradd' for #{user['username']}"
"useradd #{user['username']}"
end
not_if do
puts "checking /etc/passwd for #{user['username']}"
"cat /etc/passwd | grep #{user['username']}"
end
end
end
Run Code Online (Sandbox Code Playgroud)
我正在使用具有以下设置的 Vagrant 对此进行测试:
Vagrant::Config.run do |config|
config.vm.box = "precise32"
config.vm.box_url = "http://files.vagrantup.com/precise32.box"
config.vm.provision :chef_solo do |chef|
chef.add_recipe "sample"
chef.json = {
:users => [
{:username => 'testA'},
{:username => 'testB'},
{:username => 'testC'},
{:username …Run Code Online (Sandbox Code Playgroud) 我正在构建一个结构来运行 Rails 应用程序。应用程序本身在 Heroku 上运行。但是,它向集群发出请求,集群通过 C 中的程序执行调用。
为了能够更快地从崩溃中恢复,我想使用 Chef 创建一个例程。我设法编写了一个“食谱”来安装您需要的一切,当我使用 Vagrant 虚拟机时,它可以完美运行。
但是,当我申请真正的服务器时,它失败了。另外我用的是Chef Solo,运行脚本之前需要手动在机器上安装一些东西,不太实用。
我不知道在这种情况下我是否应该使用 Chef Server。恐怕这是满足“小”需求的“伟大”工具。
这个集群只有三台机器组成,这个应该不会增加太多。但是,该应用程序还会向另一个稍大的集群(6 台机器)发出请求,尽管安装速度非常快,但也可以使用 Chef 服务器。
应该使用 Chef 还是 Chef Solo Server?有没有关于它的教学指南?开发人员文档非常混乱。