热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ansible+Vagrant+Expressjs

据某大牛说,Ansible比chef、puppet都好使。学习一下怎么样用ansibleprovisioning一个vagrant管理的虚拟机,用来启动expressjs的服务器

据某大牛说,Ansible比chef、puppet都好使。学习一下怎么样用ansible provisioning 一个vagrant管理的虚拟机,用来启动expressjs的服务器。github链接:https://github.com/kiwiwin/ansible-nodejs-demo


创建一个呆呆的expressjs工程

$ express nodejs-ansible

$ cd nodejs-ansible

$ npm install

验证服务器可以work

$ npm start

$ curl http://localhost:3000

Express

Welcome to Express

%


Ok,这样我们就已经搭建了一个hello world的express服务器的code base了


创建Ansible Playbooks

目录结构如下:

bubuko.com,布布扣


在expressjs-playbook.yml中我们定义了两个role,一个是nodejs,一个是server。nodejs这个role主要用于安装一些nodejs必要的环境,而server这个role主要是用于checkout源代码,启动服务器等等。


nodejs role没有什么好说的,感兴趣的可以看看给出的github链接。


server role其实也是非常简单的。这里我们使用了forever用来管理我们的nodejs app。

在provision/server/tasks/server.yml中。

1)我们首先使用git checkout我们的代码:默认下,checkout的是HEAD

- name: checkout demo source code

  git: repo=git://github.com/kiwiwin/ansible-nodejs-demo.git

       dest=/nodejs-demo

2)然后在checkout代码的目录下调用npm install,这样就会安装package.json下使用的npm包。

- name: install node dependencies

  npm: path=/nodejs-demo


3)使用forever获取正在运行的nodejs app,并且把正在运行的list存在一个叫做running_app的变量(variable)里面,供后面使用

- name: get running app list with forever

  command: forever list

  register: running_app


4) 从running_app中判断nodejs-demo是否已经在运行,如果正在运行,那就restart

- name: restart server if server is already running
  command: forever restart /nodejs-demo/bin/www
  when: "running_app.stdout.find(‘/nodejs-demo/bin/www‘) != -1"

5)从running_app中判断nodejs-demo是否已经在运行,如果没有,那就start
- name: start server
  command: forever start /nodejs-demo/bin/www
  when: "running_app.stdout.find(‘/nodejs-demo/bin/www‘) == -1"



创建一个Vagrantfile

我们已经有了expressjs的code base,也有了ansible的playbooks。下一步就是在vagrantfile中指定用ansible做provisioning

1)初始化Vagrantfile

$ vagrant init


2)编辑Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
# Vagrantfile API/syntax version. Don‘t touch unless you know what you‘re doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "precise64"
  # The url from where the ‘config.vm.box‘ box will be fetched if it
  # doesn‘t already exist on the user‘s system.
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  config.vm.define "expressjs" do |cfg|
    cfg.vm.host_name = "expressjs-server.vm"
    # Forward port 5432 on the gust to 5432 on the host
    cfg.vm.network :forwarded_port, guest:3000, host:3333
    #The DB server will be at IP address 192.168.33.33
    cfg.vm.network :private_network, ip: "192.168.33.33"

    cfg.vm.provisioning :ansible do |ansible|
        ansible.playbook = "provision/expressjs-playbook.yml"
        ansible.verbose = ‘v‘
    end
  end
end


上面中比较重要的有几个点:

a)我们是把虚拟机中3000这个端口forward到了本机的3333端口,这样你就可以通过localhost:3333访问虚拟机中localhost:3000的服务器了

b)指定用作provision的playbook到provison/expressjs-playbook.yml


3)验证

$vagrant up

(如果有提示需要做vagrant provision,那就直接输入vagrant provision就行)

$curl http://localhost:3333

Express

Welcome to Express

%


结果和本地是一模一样的,搞定



参考资料:

https://servercheck.in/blog/start-nodejs-app-with-forever-and-ansible

http://cnodejs.org/topic/5021c2cff767cc9a51e684e3

Ansible + Vagrant + Expressjs,布布扣,bubuko.com


推荐阅读
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 在Notepad++中配置Markdown语法高亮及实时预览功能
    本文详细介绍了如何在Notepad++中配置Markdown语法高亮和实时预览功能,包括必要的插件安装和设置步骤。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文探讨了一种常见的C++面试题目——实现自己的String类。通过此过程,不仅能够检验开发者对C++基础知识的掌握程度,还能加深对其高级特性的理解。文章详细介绍了如何实现基本的功能,如构造函数、析构函数、拷贝构造函数及赋值运算符重载等。 ... [详细]
  • 本文介绍了如何在AngularJS应用中使用ng-repeat指令创建可单独点击选中的列表项,并详细描述了实现这一功能的具体步骤和代码示例。 ... [详细]
  • 在项目冲刺的最后一天,团队专注于软件用户界面的细节优化,包括调整控件布局和字体设置,以确保界面的简洁性和用户友好性。 ... [详细]
  • JavaScript 页面卸载事件详解 (onunload)
    当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
  • 探索Java 11中的ZGC垃圾收集器
    Java 11引入了一种新的垃圾收集器——ZGC,由Oracle公司研发,旨在支持TB级别的内存容量,并保证极低的暂停时间。本文将探讨ZGC的开发背景、技术特点及其潜在的应用前景。 ... [详细]
  • 本文探讨了使用普通生成函数和指数生成函数解决组合与排列问题的方法,特别是在处理特定路径计数问题时的应用。文章通过详细分析和代码实现,展示了如何高效地计算在给定条件下不相邻相同元素的排列数量。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 探索AI智能机器人自动盈利系统的构建
    用户可通过支付198元押金及30元设备维护费租赁AI智能机器人,推荐他人加入可获得相应佣金。随着推荐人数的增加,用户将逐步解锁更高版本,享受更多收益。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
author-avatar
许晓慧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有