有人能向我解释一下厨师的工作原理吗? 这是一个相当广泛的问题,所以要缩小它的范围,我有这个非常简单的配方,循环用户列表,并创build每个用户,如果他们不存在。 这是行不通的。 从我可以告诉循环似乎正在发生,如我所料。 一旦循环已经完成我的bash命令来创build每个用户执行,每循环一次迭代。 但是,执行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 我使用以下设置使用Vagranttesting: Vagrant::Config.run do |config| config.vm.box = "precise32" config.vm.box_url = […]
当安装gitolite时,我发现: # aptitude install gitolite The following NEW packages will be installed: gitolite 0 packages upgraded, 1 newly installed, 0 to remove and 29 not upgraded. Need to get 114 kB of archives. After unpacking 348 kB will be used. Get:1 http://security.debian.org/ squeeze/updates/main gitolite all 1.5.4-2+squeeze1 [114 kB] Fetched 114 kB in 0s (202 kB/s) […]
引用厨师独奏的惯用方法是什么? 大多数网站都这样做: chef-solo -c ~/solo.rb -j ~/node.json -r http://www.example.com/chef-solo.tar.gz 但是这很长。 有几个简单的方法可以做到这一点,我可以想到: 一个耙子任务( rake chef-solo )。 一个小的shell脚本( run-chef-solo )。 一个别名(可以覆盖名称,像chef-solo )。 什么是这样做的惯用方法? 其他厨师用户如何调用厨师?
我正处于厨师可能开始服务(postgres)的情况,但可能会随后停止带外服务。 我想要一个后续的厨师运行,导致该服务正在运行。 我试过这个: service "postgresql" do action :start end 但是这并没有影响,据说(up to date)大概是因为厨师知道它已经启动了,并且不能够说明它已经停止了。 (可能是由于service … status如何performance这个服务?)如果我写这个: # anti-pattern warning! execute "force-start-postgresql" do command "service postgresql start || /etc/init.d/postgresql start" action :run end 我得到所需的行为。 还有一个action :restart使其运行。 然而,由于可移植性,这些看起来像反模式(并且在后一种情况下再次启动之前可能会阻止它)。 那么,我怎么能告诉厨师强行启动服务,即使它认为它已经在运行? 这是使用由OpsCode托pipe的Chef 11.6和默认的postgresql配方。 (请注意,这是相似的,但我觉得不像Chef中的“最新”资源强制操作一样) — 编辑 (澄清后jtimberland后)— 这里的-l debug显示: DEBUG: service[postgresql] supports status, running DEBUG: service[postgresql] is running 即使它没有运行。 所以这听起来像一个错误,我对此感兴趣。 […]
我想在厨师食谱中做这样的事情: maven_artifact "/opt/foo/my.jar" do source "com.foo:my:0.1:jar" end 但是我找不到提供这个的食谱。 我写了一些基本上这样做,但它不处理快照,这需要parsingmaven-metadata.xml。 在我尝试这个之前,我想确定我没有错过一些明显的东西,因为这看起来像是一个基本的用例。
我了解在多服务器环境中使用厨师和木偶的优势。 它非常适合在多台服务器上执行和描述configuration。 但是,让我们说你有一台服务器, chef-solo给你简单的手动configuration服务器有什么好处? 我喜欢厨师,但我想不出为什么花时间设置厨师独奏的理由是值得在单个甚至2个服务器架构上的麻烦,但显然人们这样做。
我正在写一个厨师菜谱来安装Hubot 。 在配方中,我做了以下几点: bash "install hubot" do user hubot_user group hubot_group cwd install_dir code <<-EOH wget https://github.com/downloads/github/hubot/hubot-#{node['hubot']['version']}.tar.gz && \ tar xzvf hubot-#{node['hubot']['version']}.tar.gz && \ cd hubot && \ npm install EOH end 但是,当我尝试在安装cookbook的服务器上运行chef-client时,我得到拒绝写入运行chef-client(而不是hubot用户)的用户的目录的权限。 出于某种原因, npm试图在错误的用户下运行,而不是在bash资源中指定的用户。 我能够sudo su – hubot -c "npm install /usr/local/hubot/hubot"运行sudo su – hubot -c "npm install /usr/local/hubot/hubot" ,并且获得我想要的结果(安装hubot作为hubot用户)。 但是,似乎chef-client不是以hubot用户的身份执行命令。 下面你会发现厨师 – 客户执行。 […]
我正在寻找关于厨师食谱版本pipe理的想法。 我知道你固定在环境中的特定版本,但我不知道如何去做。 我们使用图书pipe理员厨师将第三方社区图书安装到cookbooks文件夹中。 我们从不碰这些书,只是不时更新到更新的版本。 我们也有我们自定义的网站特定的食谱,从那里我们包括社区( include_recipe )。 从理论上讲,我们可以指定我们自定义书籍所依赖的社区书籍的特定版本,然后在环境configuration中设置我们的菜谱版本,但问题是这些社区书籍可能依赖于其他书籍,而没有指定版本。 而且这种深层嵌套的依赖关系可能会继续下去。 所以没有保证,当你上传食谱的厨师服务器,它不会打破刺激,因为依赖食谱也可能会改变。 我目前唯一可以看到的解决scheme是指定我们在环境configuration中使用的每一个cookbook版本,包括社区和自定义版本。 但是,我必须仔细阅读每本食谱,并找出这些版本。 我们也不时地做图书pipe理员 – 厨师更新,我想可能很难追踪更改的版本,而且在时间到了之际,不要忘记在环境中更新版本。 请分享您的经验和最佳做法。 我相信这对其他人来说是非常有用的。
我们有2-3个节点集群用于我们的负载均衡器和各种Web应用程序。 我必须首先在QA中进行更改,然后分阶段(在2-3台服务器上),然后在生产(2-3台)服务器上进行。 厨师或傀儡这样的configurationpipe理工具是否适合这里? 或者它是矫枉过正? 如果这是过度杀伤有任何提示,使这更容易。
鉴于以下配方: ruby_block "block1" do block do puts "in block1" end action :create end remote_file "/tmp/foo" do puts "in remote_file" source "https://yahoo.com" end 我期望ruby_block首先运行(因为它首先),然后remote_file。 我想使用ruby_block来确定从下载的remote_file的URL,所以顺序是重要的。 如果不是我的puts()语句,我会假设这些按照预期的顺序运行,因为日志说: ==> default: [2014-06-12T17:49:19+00:00] INFO: ruby_block[block1] called ==> default: [2014-06-12T17:49:19+00:00] INFO: remote_file[/tmp/foo] created file /tmp/foo ==> default: [2014-06-12T17:49:20+00:00] INFO: remote_file[/tmp/foo] updated file contents /tmp/foo 但是在上面,我的puts()语句如下所示: ==> default: in remote_file ==> default: […]