我有一个厨师食谱,我想要采取节点['cfn'] ['环境']下的所有属性,并将它们写入一个yml文件。 我可以做这样的事情(工作正常): content = { "environment_class" => node['cfn']['environment']['environment_class'], "node_id" => node['cfn']['environment']['node_id'], "reporting_prefix" => node['cfn']['environment']['reporting_prefix'], "cfn_signal_url" => node['cfn']['environment']['signal_url'] } yml_string = YAML::dump(content) file "/etc/configuration/environment/platform.yml" do mode 0644 action :create content "#{yml_string}" end 但我不喜欢我必须明确列出属性的名称。 如果后来我添加一个新的属性,它会很好,如果它自动包含在写出的XML文件。 所以我尝试了这样的事情: yml_string = node['cfn']['environment'].to_yaml 但是因为节点实际上是一个Mash,所以我得到了一个像这样的platform.yml文件(它包含了许多我不想要的意外嵌套): — !ruby/object:Chef::Node::Attribute normal: tags: [] cfn: environment: &25793640 reporting_prefix: Platform2 signal_url: https://cloudformation-waitcondition-us-east-1.s3.amazonaws.com/… environment_class: Dev node_id: i-908adf9 […]
我在食谱中有以下几行 service "apache" do action :stop end # Do something.. service "apache" do action :start end 我发现第二个块没有执行。 任何原因?
厨师独奏缺乏环境支持似乎颇具争议。 一方面,环境的一个特点就是能够将烹饪书钉到特定的环境,而这对于厨师独奏来说绝对没有意义。 另一方面,我们很多人希望能够在环境级别的属性中进行合并,并在使用Vagrant进行testing时使用环境特定的运行列表。 我想我可能find了一个简单的方法来解决这个问题。 假设我在我的所有环境和angular色中都使用了JSON语法,并且遵循以下约定来设置属性(从最低到最高的优先级): 默认在食谱属性文件中 在angular色文件中默认 在环境文件中覆盖 看起来我可以自己parsing这些文件,并使用-j选项将属性注入到chef-solo中。 例如,我可以在我的Vagrantfile中做这样的事情: chef_env_conf = parse_json("./environments/#{ENV['CHEF_ENVIRONMENT']}.json") chef.json = chef_env_conf["override_attributes"] 由于通过-j选项设置的属性是以正常的优先级应用的 ,所以这可以成为覆盖angular色默认值的另一种方式,并且这可能是在环境未被自动拉入的上下文中所需的全部。 你可以做类似的事情来获得每个环境的运行列表(通过parsingangular色文件): chef_role_conf = parse_json("./roles/#{role}.json") chef.run_list = chef_role_conf["env_run_lists"][ENV['CHEF_ENVIRONMENT']] 我意识到这不是最优雅的黑客,但它似乎可能是一些人可行的解决scheme。 有谁认为这是一个非常糟糕的主意?
我已经阅读了厨师的文档两次。 我仍然无法围绕它的概念,因为他们跳过基础知识,并跳转到与厨师服务器复杂的部署。 使用厨师独奏和可能刀,是否有一个简单的方法来configuration服务器和部署? 我可能是错的,但似乎与我的食谱准备,这应该是非常简单的。 knife rackspace server create –flavor 1 –image 112 这提供了我的服务器。 我可以select传递–run-list“recipe [mything]”,但是我的烹饪书在〜/ my_cookbooks中如何实际上在服务器上? 我必须手动转移它们吗? 这似乎适得其反。
在资源中使用属性(如模板)时,如果没有合理的默认值,build议使用哪种方法。 期望属性值在运行时提供。 如果不是,厨师食谱执行应该是错误的。 现在我有东西的方式应用到模板的属性值是空string。 /recipes/default.rb template "/var/tmp/my_script.sh" do source "my_script.erb" mode "0755" variables({ :url => node['environment']['url'] }) end /templates/default/my_script.erb #!/bin/bash echo "The url is: <%= @url %>" 生成的/var/tmp/my_script.sh文件看起来像这样: #!/bin/bash echo "The url is: " 但是,我希望它只是错误。 任何build议?
我在一起构build一个运行Rails应用程序的结构。 应用程序本身在Heroku上运行。 但是,它向一个集群发出请求,集群通过C中的一个程序执行呼叫。 为了能够更快地恢复崩溃,我想用厨师创build一个例程。 我设法编写一个“食谱”,安装你需要的一切,当我使用Vagrant虚拟机时,它完美的工作。 但是,当我申请一个真正的服务器,它失败了。 此外,我正在使用Chef Solo,在运行脚本之前我需要在机器上手动安装一些东西,这不是很实用。 在这种情况下,我不知道是否应该拿主厨服务器。 恐怕这是一个“小”需求的“伟大”工具。 这个集群只有三台机器,这不应该增加太多。 但是,该应用程序还向另一个稍大的群集(6台机器)发出请求,尽pipe安装非常快,但也可以使用Chef Server。 应该与厨师或厨师独奏服务器? 有没有关于它的教学指导? 开发人员的文档非常混乱。
有人能向我解释一下厨师的工作原理吗? 这是一个相当广泛的问题,所以要缩小它的范围,我有这个非常简单的配方,循环用户列表,并创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 = […]
我了解在多服务器环境中使用厨师和木偶的优势。 它非常适合在多台服务器上执行和描述configuration。 但是,让我们说你有一台服务器, chef-solo给你简单的手动configuration服务器有什么好处? 我喜欢厨师,但我想不出为什么花时间设置厨师独奏的理由是值得在单个甚至2个服务器架构上的麻烦,但显然人们这样做。
如果我有一个模板被创build,我怎样才能确保该目录存在? 例如: template "#{node[:app][:deploy_to]}/#{node[:app][:name]}/shared/config/database.yml" do source 'database.yml.erb' owner node[:user][:username] group node[:user][:username] mode 0644 variables({ :environment => node[:app][:environment], :adapter => node[:database][:adapter], :database => node[:database][:name], :username => node[:database][:username], :password => node[:database][:password], :host => node[:database][:host] }) end 由于/var/www/example/shared/config不存在,因此database.yml将被复制到此目录中。 我在想如何木偶让你“确保”一个目录存在。
我的团队创造了大量的厨师食谱。 我想知道我应该看什么方法和框架,所以我们可以开始创buildtesting,以确保我们的节点configuration正确?