15

我想在 ansible playbook 中启动我的 node.js 应用程序。现在,最终指令如下所示:

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

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

4

4 回答 4

29

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 的博客上有一个完整的示例,说明如何使用 Forever 和 Ansible 启动 Node.js 应用程序。

于 2014-01-27T15:46:50.847 回答
4

Using Forever is the best solution for running nodejs app in background. The solution of @geerlingguy is great for running the app once, but if you want to re-deploy the app, you must stop the server first, and then start it again:

- 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
于 2014-06-07T08:32:50.843 回答
1

尝试使用 nohup:

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

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

于 2014-01-23T20:57:59.960 回答
1

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

process.on('SIGHUP', function() {
            logger.info("SIGHUP signal was interrupted");
        });
于 2016-08-04T13:13:00.673 回答