Chef infra 如何在使用应用程序cookbook时运行安装活动?

Chef infra 如何在使用应用程序cookbook时运行安装活动?,chef-infra,chef-recipe,cookbook,Chef Infra,Chef Recipe,Cookbook,我正在尝试使用应用程序\u ruby cookbook部署我的Rails应用程序。我需要运行一些一次性的设置活动(比如使用rakedb:seed对数据库进行种子设定)。这些不应在后续厨师运行期间进行。定义这些任务的正确方法是什么 尝试使用gem。这种方式可以运行许多rake任务(您可以说是哪些任务),比如迁移,这意味着不需要执行两次。然后,您必须记住,如果您想要更改以前由这个rake任务之一执行的某些内容,您必须创建一个新的任务(如迁移) 出于种子目的,您可以尝试使用。使用约束 技术。我相信,这

我正在尝试使用应用程序\u ruby cookbook部署我的Rails应用程序。我需要运行一些一次性的设置活动(比如使用
rakedb:seed
对数据库进行种子设定)。这些不应在后续厨师运行期间进行。定义这些任务的正确方法是什么

  • 尝试使用gem。这种方式可以运行许多rake任务(您可以说是哪些任务),比如迁移,这意味着不需要执行两次。然后,您必须记住,如果您想要更改以前由这个rake任务之一执行的某些内容,您必须创建一个新的任务(如迁移)

  • 出于种子目的,您可以尝试使用。使用约束 技术。我相信,这是seed的正确用法,但是有seed_-fu语法

  • 有些人将种子或数据放入迁移中(我不喜欢)。看看 . 我认为,这是最糟糕的合并种子和迁移不是一个好主意。种子在时间上的变化意味着新的迁移,而种子在环境中的变化几乎是不可能的


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

    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
    

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

    感谢您提供的提示!我不想触碰应用程序本身,而是将逻辑转移到部署配方上。当你的种子需要新记录时,你该怎么做。例如:新管理员用户、国家/地区等?。转到删除#{node[:deploy_path]}/db.seeded文件并再次启动chef cook?这样就不再是一次性的安装活动。在某种程度上,这可能与迁移有关,IMO。我关心的是更多的步骤需要进行一次,而且只能进行一次。