2013-04-08 81 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 
相關問題