将Postgresql与Amazon Opsworks一起使用 - 在database.yml中获取IP地址

时间:2013-05-02 18:42:07

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

我正在尝试使用Amazon Opsworks与Postgres一起使用基本的rails应用程序。 Opsworks目前缺乏对Postgres的内置支持,但我正在使用一些我发现似乎写得很好的烹饪书。我已将它们全部分配到我的自定义食谱:https://github.com/tibbon/custom-opsworks-cookbooks

无论如何,我现在陷入困境的是将master postgres数据库的ip地址输入到database.yml文件中。它似乎应该指定多个后端,有点像我的haproxy服务器将所有rails服务器视为'后端'。

有没有人得到这个工作?

2 个答案:

答案 0 :(得分:4)

我必须在我的Rails层添加一些自定义JSON。

看起来像这样:

{
  "deploy": {
    "my-app-name": {
      "database": {
        "adapter":"mysql2",
        "host":"xxx.xx.xxx.xx"
      }
    }
  }
}

答案 1 :(得分:1)

我认为你必须定义一个自定义配方来更新database.yml并重新启动app服务器。

this guide中,使用redis服务器完成同样的事情:

node[:deploy].each do |application, deploy|
  if deploy[:application_type] != 'rails'
    Chef::Log.debug("Skipping redis::configure as application #{application} as it is not an Rails app")
    next
  end

  execute "restart Rails app #{application}" do
    cwd deploy[:current_path]
    command "touch tmp/restart.txt"
    action :nothing
    only_if do
      File.exists?(deploy[:current_path])
    end
  end

  redis_server = node[:opsworks][:layers][:redis][:instances].keys.first rescue nil

  template "#{deploy[:deploy_to]}/current/config/redis.yml" do
    source "redis.yml.erb"
    mode "0660"
    group deploy[:group]
    owner deploy[:user]
    variables(:host => (node[:opsworks][:layers][:redis][:instances][redis_server][:private_dns_name] rescue nil))
    notifies :run, resources(:execute => "restart Rails app #{application}")

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

我还没有为自己测试过这个,但我相信我会很快,我会尽快更新这个答案。