Ansible在启动node.js服务器时挂起

时间:2014-01-04 09:30:51

标签: node.js ansible

我想在ansible playbook中启动我的node.js应用程序。现在,最终的指令看起来像这样:

  - name: start node server
    shell: chdir=${app_path} npm start&

问题是ansible永远不会从此返回。我怎样才能继续?

4 个答案:

答案 0 :(得分:26)

Forever似乎是启动和守护Node.js应用程序的最简单,最简单的方法。目前,永远没有Ansible模块,但您仍然可以使用以下播放器永久安装并运行您的应用程序:

- name: "Install forever (to run Node.js app)."
  npm: name=forever global=yes state=present

- name: "Check list of Node.js apps running."
  command: forever list
  register: forever_list
  changed_when: false

- name: "Start example Node.js app."
  command: forever start /path/to/app.js
  when: "forever_list.stdout.find('/path/to/app.js') == -1"

这是完全幂等的,对我来说非常有用。你可以为Ansible编写一个小forever模块为你做这些事情(比如service模块),但现在这个有效。

我在Server Check.in的博客上有一个如何start a Node.js app with Forever and Ansible的完整示例。

答案 1 :(得分:4)

使用Forever是在后台运行nodejs app的最佳解决方案。 @geerlingguy的解决方案非常适合运行应用程序一次,但是如果要重新部署应用程序,则必须先停止服务器,然后再次启动它:

- name: Get app process id
  shell: "ps aux | grep app.js | grep -v grep | awk '{print $2}'"
  register: process_id

- name: Stop app process
  shell: kill -9 {{ item }}
  with_items: process_id.stdout_lines
  ignore_errors: True  # Ignore error when no process running

- name: Start application
  command: forever start path/to/app.js
  environment:
    NODE_ENV: production  # Use this if you want to deploy the app in production

答案 2 :(得分:1)

尝试使用nohup:

- name: start node server
  shell: chdir=${app_path} nohup npm start &

然而,更好的方法可能是尝试使用forever,因此如果应用程序终止,它将自动重启。

答案 3 :(得分:1)

当你关闭shell时,进程获得SIGHUP信号(如kill -1)。 您可以在app.js文件中捕获“SIGHUP”信号。

process.on('SIGHUP', function() {
            logger.info("SIGHUP signal was interrupted");
        });