Node.js 利用pm2与ansible

Node.js 利用pm2与ansible,node.js,npm,ansible,pm2,Node.js,Npm,Ansible,Pm2,我正试图通过ansible启动一个使用pm2的节点程序。问题在于pm2 start命令在ansible下不是幂等的。再次运行时会出现错误 这是我最喜欢的剧本 - name: start the application become_user: ubuntu command: pm2 start app.js -i max tags: - app 现在,如果我第一次运行它,那么它会正常运行,但是当我再次运行它时,我会收到一个错误,告诉我脚本已经在运行 通过ansible解决

我正试图通过ansible启动一个使用pm2的节点程序。问题在于
pm2 start
命令在ansible下不是幂等的。再次运行时会出现错误

这是我最喜欢的剧本

- name: start the application
  become_user: ubuntu
  command: pm2 start app.js -i max
  tags: 
    - app
现在,如果我第一次运行它,那么它会正常运行,但是当我再次运行它时,我会收到一个错误,告诉我脚本已经在运行


通过ansible解决此错误并正确处理pm2的正确方法是什么。

在启动脚本之前,您应该删除上一个,如下所示:

 - name: delete existing pm2 processes if running
   command: "pm2 delete {{ server_id }}"
   ignore_errors: True
   become: yes
   become_user: rw_user


 - name: start pm2 process
   command: 'pm2 start -x -i 4 --name "{{server_id}}" server.js'
   become: yes
   become_user: rw_user
   environment:
    NODE_ENV: "{{server_env}}"
我会用

pm2重新加载app.js-i max


它将允许您重新加载配置;-)

当我重新运行我的剧本时,我多次在这一页上寻找
start
PM2的解决方案。我还希望PM2在服务器已经运行时重新加载服务器,并获取可能已部署的新代码。原来PM2有这样一个接口:

- name: Start/reload server 
  command: '{{path_to_deployed_pm2}} startOrReload pm2.ecosystem.config.js'
startOrReload
命令需要一个所谓的“生态系统”文件。有关详细信息,请参阅文档:

这是一个适用于我的最小的
pm2.economy.config.js

module.exports = {
  apps : [{
    script: 'app.js',
    name: "My app"
  }],
};

为什么不在启动脚本中使用pm2 as服务?@arbababanazar我想完全使用ansible设置服务器,即服务启动点。所以我也需要ansible来处理这一步。我的主要问题是这个游戏不是幂等的,如果我再次运行它就会失败。我甚至在生产中使用ansible运行pm2 as服务。你能分享一些游戏代码吗?我明白你的意思。但是,如果pm2已经在运行,而我又在运行ansible作业,那该怎么办呢。在这种情况下,开始播放将失败。另外,如果我每次运行playbook时都删除现有进程,则会导致服务中断。@shivams但在启动新进程之前,我使用
pm2 delete{{{server_id}}
删除prevoius,我使用此解决方案,它可以工作,当我部署新的应用程序版本时,如果您部署新的应用程序版本,这将非常有效,但是,如果我在现有的设置上再次运行play,那么我现在看到的是应用程序重新启动。@shivams在这一点上,它在我的应用程序中工作没有问题,但是有ofcource命令可以重新启动特定进程
$pm2 restart 0#restart specific process id
,如果您担心服务中断,您可以使用应用程序运行中的说明将您的应用程序重新启动,如果应用程序已经运行,则游戏将有理由失败。我可以将ignore_错误放在那里,并在debug中打印stderr,以检查是否存在这种情况。对于部署,我可以很容易地遵循您的方法。