Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在使用opsworks部署时仅在特定层中的第一个实例上运行命令?_Php_Amazon Web Services_Aws Opsworks - Fatal编程技术网

Php 如何在使用opsworks部署时仅在特定层中的第一个实例上运行命令?

Php 如何在使用opsworks部署时仅在特定层中的第一个实例上运行命令?,php,amazon-web-services,aws-opsworks,Php,Amazon Web Services,Aws Opsworks,我们正在aws opsworks上部署Laravel应用程序,一切都运行良好,但我们还需要做两件事: 1) 在每次部署中,我们都希望运行php artisan migrate,以安装数据库更新。 2) 我们有一个文件(app/database/run.list),其中包含一个类名列表,用于我们要运行的文件中的每一行php artisan db:seed--class={line from file}。 e、 g run.list包含 NewSystemSeed NewUserSeed Creat

我们正在aws opsworks上部署Laravel应用程序,一切都运行良好,但我们还需要做两件事:

1) 在每次部署中,我们都希望运行
php artisan migrate
,以安装数据库更新。
2) 我们有一个文件(app/database/run.list),其中包含一个类名列表,用于我们要运行的文件中的每一行
php artisan db:seed--class={line from file}
。 e、 g

run.list包含

NewSystemSeed
NewUserSeed
CreateDefaultTemplatesSeed
我们想跑步

php artisan db:seed --class=NewSystemSeed
php artisan db:seed --class=NewUserSeed
php artisan db:seed --class=CreateDefaultTemplatesSeed
这部分不太难(尽管我有点被最后一部分卡住了)。 我一直坚持的一点是,我们只想在特定层(php应用层)的第一个实例上这样做

很明显,我们不希望最终为每个实例播种数据库


是否有一种方法可以自动执行此操作,或者我们必须创建另一个配方,然后在部署后在实例上手动触发此配方?

您可以在OpsWorks中将层用作标记来通知配方

创建一个新层(可能是“db seeder”)。不要在该层中添加新实例,而是从PHP层添加现有实例

创建一个新的自定义配方,如下所示:

if node[:opsworks][:instance][:layers].include?("db-seeder")
  config_file = 'app/database/run.list'
  bash "migrate db" do
    code %Q^
      php artisan migrate
      for clz in `cat #{config_file}` do;
        php artisan db::seed --class=${clz};
      done^
  end
end
上述配方将仅在“db seeder”层中的实例上运行。
将此自定义配方添加到PHP应用程序层的“deploy”事件中。

您可以从应用程序层的Opsworks实例列表中选择第一个实例,并始终在那里进行迁移,而不是将一个实例放在一个特殊的层中,这会在该实例发生故障时造成单点故障。这允许您保持配置不变,并确保始终在运行的实例上运行迁移,因为失败的实例不在列表中

migrations_instance_hostname = node[:opsworks][:layers]['app-layer'][:instances].keys.sort.first

if migrations_instance_hostname == node[:opsworks][:instance][:hostname]
  # do migrations
end

请注意,我不确定SO是否是解决此问题的最佳SE站点,因此如果有更好的站点解决devops相关问题,请让我知道!好问题。当播种机运行并在启动时检查它时,您是否可以向数据库写入一些内容?这样,其他服务器会看到标志并跳过种子。@ceejayoz,迁移就是这么做的,理论上我们可以将种子写为迁移,但我们的种子通常写为幂等,所以如果我们想更新角色列表,我们的种子会删除所有角色并再次插入每个角色,所以它们是可重复使用的。我知道在弹性豆茎和ebextensions中有一个leader_-only的概念,这将是完美的。。