Opsworks定制厨师食谱

时间:2013-04-08 19:48:28

标签: ruby ruby-on-rails-3 amazon-web-services chef

我已经使用AWS OpsWorks成功部署了我的应用程序,现在我正在尝试实现一个自定义的Chef Cookbook,它允许我设置bash环境变量。我已经设置了Git repo,正在使用OpsWorks更新这本食谱。我在我的dev框中使用knife命令生成了cookbook,这只是一个包含几行代码的recipes/default.rb文件的目录结构。

当我尝试做类似以下的事情时,我似乎一直在犯错误

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

我是Chef的新手,所以我确信有一些简单的我做错了我只是无法弄明白。在此先感谢您的帮助。

5 个答案:

答案 0 :(得分: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堆栈层中使用的自定义Chef JSON:

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

答案 1 :(得分: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 :(得分:2)

clb正确回答了你的第二个问题。至于你的第一个,'命令'不是一个有效的厨师资源,你需要像:

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

答案 3 :(得分:1)

OpsWorks有一项新功能,您可以在App上添加Environmentvariables

您可以通过

访问它们
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

答案 4 :(得分:0)

我们做了类似的事情,并通过将我们的环境变量添加到Opsworks仪表板中的json配置文件来解决它。在chef中,我们使用此模板在部署时编写文件: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"
      }
    }
  }
}