2013-04-08 79 views
0

我已经成功地部署了我的应用程序使用AWS OpsWorks,现在我正在尝试实现自定义的厨师食谱,这将允许我设置bash环境变量。我已经安装了Git repo,Cookbook正在使用OpsWorks进行更新。我使用我的开发盒上的knife命令生成了食谱,它实际上只是包含几行代码的recipes/default.rb文件的目录结构。Opsworks自定义厨师Recipies

当我尝试做一些像下面我似乎不断收到错误

node[:deploy].each do |application, deploy| 
    deploy = node[:deploy][application] 
    command "ls -la" 
end 

(注:LS -la是只是为了测试我知道这不会设置环境变量)

我得到以下错误:ERROR: Caught exception during execution of custom recipe: xyz-enviroment: NoMethodError - undefined method command' for #<Chef::Recipe:0x7feb59200c00> - /opt/aws/opsworks/releases/20130328224322_109/vendor/bundle/ruby/1.8/gems/chef-0.9.15.5/bin/../lib/chef/mixin/recipe_definition_dsl_core.rb:56:in method_missing

另外,如果我尝试像

execute "setting up the enviroment" do 
    # TODO: Add code that does something here 
end 

我得到以下错误:

execute[setting up the enviroment] (/opt/aws/opsworks/current/site-cookbooks/xyz-enviroment/recipes/default.rb:18:in `from_file') had an error: 
No such file or directory - setting up the enviroment 

我是新来的厨师,所以我敢肯定有一些简单的,我做错了我只是一直没能弄明白。先谢谢您的帮助。

回答

4

我已经解决了我的问题,看到下面的答复之前,他们可能一直在努力解决这个问题,但我不现在有时间回去尝试一下。

我的解决方案是使用Chef模板创建一个初始化文件,以在rails启动应用程序时设置变量。

# deafult.rb 

node[:deploy].each do |application, deploy| 
    deploy = node[:deploy][application] 

    execute "restart Rails app #{application}" do 
     cwd deploy[:current_path] 
     command node[:opsworks][:rails_stack][:restart_command] 
     action :nothing 
    end 

    template "#{deploy[:deploy_to]}/current/config/initializers/dev_enviroment.rb" do 
     source "dev_enviroment.erb" 
     cookbook 'dev-enviroment' 
     group deploy[:group] 
     owner deploy[:user] 
     variables(:dev_env => deploy[:dev_env]) 

     notifies :run, resources(:execute => "restart Rails app #{application}") 

     only_if do 
      File.exists?("#{deploy[:deploy_to]}") && File.exists?("#{deploy[:deploy_to]}/current/config/") 
     end 
    end 
end 

dev_enviroment.erb

ENV['VAR1'] = "<%= @dev_env[:VAR1] %>" 
ENV['VAR2'] = "<%= @dev_env[:VAR2] %>" 

在Opsworks使用的自定义厨师JSON堆栈层:

{ 
    "deploy": { 
     "myapp": { 
      "dev_env": { 
       "VAR1": "INFO1", 
       "VAR2": "INFO2", 
      } 
     } 
    } 
} 
+0

这似乎工作。但是,我很想知道你最近是否找到了替代解决方案。有希望的是,无需重新启动Web服务器。 – 2014-01-28 19:07:19

2

您没有指定要运行的命令,所以它实际上试图运行setting up the environment,这不是有效的命令。

尝试不是指定块内的command属性:

execute "setting up the enviroment" do 
    command "/path/to/command --flags" 
end 

另外,设置资源名称命令本身:

execute "/path/to/command --flags" do 
    # TODO: Add code that does something here 
end 
2

你的第二个问题是正确的CLB回答。关于你提到的第一个,“命令”不是一个有效的厨师资源,你想要的东西,如:

node[:deploy].each do |application, deploy| 
    deploy = node[:deploy][application] 
    execute "running a command for #{application}" do 
    command "ls -la" 
    end 
end 
+0

真。我完全错过了第一个。 :) – cassianoleal 2013-04-09 13:48:08

0

我们做同样的事情,并加入我们的环境变量的解决了这个问题Opsworks仪表板中的json配置文件。在厨师,我们写这个模板文件部署:https://github.com/octocall/opsworks-cookbooks/blob/34e60267a4d3b5b9cf84e91829cc80c98c26f8ed/deploy/definitions/opsworks_rails.rb#L26,然后我们使用JSON文件的“symlink_before_migrate”属性的符号链接,就像这样:

{ 
    "deploy": { 
    "APPNAME": { 
     "symlink_before_migrate": { 
     "config/.env": ".env" 
     } 
    } 
    } 
} 
1

OpsWorks有一项新功能,在那里你可以添加Environmentvariables在App

您可以通过

node[:deploy]['appshortname'][:environment_variables][:variable_name] 

(见http://docs.aws.amazon.com/opsworks/latest/userguide/attributes-json-deploy.html#attributes-json-deploy-app-environment

所以,你可以访问它们直接设定他们你这样的背景下厨师:

node[:deploy]['magento']['environment_variables'].each {|key, value| ENV[key]=value } 

你也可以“倾倒”到这一点,例如一个shell脚本是这样的:

file "#{release_path}/environment.sh" do 
    content ENV.reduce("#!/bin/bash\n") { |a, e| a + "export #{e[0]}=\"#{e[1]}\"\n" } 
    mode '0775' 
end 
相关问题