【问题标题】:How to run setup activities when using application cookbook?使用应用程序说明书时如何运行设置活动?
【发布时间】:2014-04-01 08:56:13
【问题描述】:

我正在尝试使用 application_ruby 食谱部署我的 Rails 应用程序。我需要运行一些一次性设置活动(例如使用rake db:seed 为数据库播种)。这些不应该在随后的厨师运行期间完成。定义这些任务的正确方法是什么?

【问题讨论】:

    标签: chef-infra chef-recipe cookbook


    【解决方案1】:
    1. 尝试使用after_party gem。 这种方式运行许多 rake 任务(你说哪些),如迁移,意味着不要执行两次。然后你必须记住,如果你想改变之前由这个 rake 任务之一执行的东西,你必须创建一个新的(比如迁移)

    2. 出于种子目的,您可以尝试使用seed_fu。使用约束 技术。我相信这对种子来说是正确的,但有 seed_fu 语法。

    3. 有些人将种子或数据放入迁移中(我不喜欢)。看着 this question/answer。我相信,这是与迁移最糟糕的合并种子不是好主意。随时间变化的种子意味着新的迁移,而随环境变化的种子几乎是不可能的。

    【讨论】:

    • 感谢这些提示!不过,我不希望触及应用程序本身,而是将逻辑转移到部署配方中。
    【解决方案2】:

    我解决这个问题的方法是使用这样的条件执行:

    execute "seed database" do
      cwd node[:release_path]
      user node[:owner]
      environment ({'RAILS_ENV' => node[:environment]})
      command "bundle exec rake db:seed && touch #{node[:deploy_path]}/db.seeded"
      not_if { ::File.exists?("#{node[:deploy_path]}/db.seeded") }
    end
    

    这可确保设置步骤只发生一次。

    【讨论】:

    • 当你的种子需要一个新的记录时你会怎么做。前任。新的 admin_user、国家等?去删除#{node[:deploy_path]}/db.seed 文件并再次厨师厨师?
    • 那么它不再是一次性设置活动。 IMO,这可能以某种方式与迁移有关。我更关心的是需要执行一次且仅一次的步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2021-07-27
    • 2013-12-21
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多