[英]Opsworks Custom Chef Recipies
我已经使用AWS OpsWorks成功部署了我的应用程序,现在我正在尝试实现自定义Chef Cookbook,这将允许我设置bash环境变量。 我已经设置了Git存储库,该菜谱正在用OpsWorks更新。 我在我的dev框上使用了knife命令生成了食谱,它实际上只是目录结构,其中包含几行代码的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的新手,所以我确定我做错了一些简单的事情,只是无法弄清楚。 先谢谢您的帮助。
在看到下面的答复之前,我已经解决了我的问题,他们可能已经解决了问题,但是我没有时间回去尝试一下。
我的解决方案是使用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",
}
}
}
}
您没有指定要运行的命令,因此实际上是在尝试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
clb正确回答了您的第二个问题。 首先,“命令”不是有效的厨师资源,您需要以下内容:
node[:deploy].each do |application, deploy|
deploy = node[:deploy][application]
execute "running a command for #{application}" do
command "ls -la"
end
end
OpsWorks具有一项新功能,您可以在其中向App添加环境变量
您可以通过访问它们
node[:deploy]['appshortname'][:environment_variables][:variable_name]
因此,您可以像这样直接为您的厨师环境设置它们:
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
我们做了类似的事情,并通过将环境变量添加到Opsworks仪表板中的json配置文件中来解决它。 在Chef中,我们使用以下模板在部署时编写文件: https : //github.com/octocall/opsworks-cookbooks/blob/34e60267a4d3b5b9cf84e91829cc80c98c26f8ed/deploy/definitions/opsworks_rails.rb#L26 ,然后使用“ symratelink_before json文件的属性,如下所示:
{
"deploy": {
"APPNAME": {
"symlink_before_migrate": {
"config/.env": ".env"
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.