我想在ansible playbook中启动我的node.js应用程序。现在,最终的指令看起来像这样:
- name: start node server
shell: chdir=${app_path} npm start&
问题是ansible永远不会从此返回。我怎样才能继续?
答案 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");
});