继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Ansible 部署 Node.js

艾贺521
关注TA
已关注
手记 292
粉丝 1.1万
获赞 1544

目录

1.1        添加额外的源

1.2        部署一个Node.js app

1.3        运行一个Node.js app

1.4        Node.js app服务器总结。


下面我们将要在我们的服务器上配置Nodejs,启动一个简单的nodejs实例,这个服务器有很简单的架构。

1450138540887391.jpg

开始了,首先创建一个playbook文件,我们尽量让它保持简单。

---
- hosts: all
  tasks:

定义一些运行这个playbook的主机,然后下面列出一系列的tasks。

1.1添加额外的源

在准备应用一个服务器的时候,为了确保指定些软件包可以用或者在最新的版本,管理员经常首先添加额外的源。

下面的脚本,我们想要添加EPEL和Remi源,以便于我们可以得到类似node.js的软件包。如果使用shell脚本处理的话,如下所示。

 # 导入 Remi GPG 密钥 – 请参阅: http://rpms.famillecollet.com/RPM-GPG-KEY-remi
wget http://rpms.famillecollet.com/RPM-GPG-KEY-remi \
 -O /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
 
# 安装 Remi repo, Remi repo里面包含了很多的PHP扩展
rpm -Uvh --quiet \
http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
 
# 安装EPEL源
yum install epel-release
 
 # 安装 Node.js (npm + 和它的依赖关系).
 yum --enablerepo=epel install npm

这个shell脚本用于导入EPEL和Remi的GPG keys,然后添加这源,最后安装Nodejs。这对于简单的部署是没有问题的,但是运行这么多命令是比较笨的方法,如果你的连接不小心断开了,那么你的脚本也会停止的。而如果这个时候,你的脚本刚准备完成呢?


提示:如果你想跳过指定的步骤,你可以跳过添加GPG keys的步骤,只需要在运行命令的时候加上—nogpgcheck.或者在Ansible中,yum模块中设置disable_gpg_check参数为yes,但是最好还是添加GPG keys。使用GPG,你可以知道包的作者是谁,包有没有修改稿,除非你知道你正在做什么,否则最好不要禁止GPG检查。


Ansible让事情变的更有健壮性,下面使用Ansible的案例显得更加详细,它和上面的shell脚本有同样的功能,但是更容易理解,更加结构化。 下面使用了Ansible的变量和其它的一些有用的特性。接着上面的playbook,我们继续往下写。

tasks:
   - name: Import Remi GPG key
     rpm_key: "key={{ item }} state=present"
     with_items:
       - "http://rpms.famillecollet.com/RPM-GPG-KEY-remi"
   - name: Install Remi repo.
     command: "rpm -Uvh --force {{ item.href }} creates={{ item.creates }}"
     with_items:
       - href: "http://rpms.famillecollet.com/enterprise/remi-release-6.rpm"
         creates: "/etc/yum.repos.d/remi.repo"
 
   - name: Install epel repo
    yum: name=epel-release state=present
 
   - name: Stop the firewall
     service: name=iptables state=stopped
 
   - name: Install NodeJS and npm
     yum: name=npm state=present enablerepo=epel

我们看一下具体步骤。

  1. rpm_key 是一个的Ansible模块用于从你的RPM数据库中添加或移除GPG key。我们正在从Remi的源中导入一个key。

  2. 因为Ansible没有rpm命令,因此我们使用command模块来使用rpm命令,这样我们可以做其它的两件事情。

  3. a)使用creatse参数告诉Ansible什么时候不运行这个命令,这个例子里,我们告诉Ansible,这个命令成功执行后,将会创建那些文件。当这个文件存在的时候,这个命令将不会运行。

  4. b)使用with_items定义一个URL和用于creates检查的文件。

  5. yum负责安装EPEL源。

  6. 因为这个服务器我们将用来做测试用,所以我们使用service模块禁止系统防火墙,防止它干涉我们测试。

  7. yum安装Node.js(同时安装npm,Node’s package manager),我们使用enablerepo来指定在EPEL源中搜索它,当然也可以使用disablerepo来指定不使用那个源(repository)。

  8. 因为NPM现在被安装了,我们使用Ansible 的npm模块安装Node.JS工具forever,forever来运行我们的app,设置global为yes,告诉NPM安装模块在/usr/lib/node_modules位置,然后所有的用户都可以使用它了。


我们已经有一个Node.js app 服务器了,让我们配置一个简单的Node.js app,在80端口响应HTTP请求


1.2部署一个Node.js app

这一步是在我们的服务器上部署简单的Node.js app。首先,通过创建一个新的文件夹,我们创建一个简单的Node.js app,这个文件夹和你上面的ymal文件处于相同的路径下面。然后创建新的文件,app.js,在这个文件夹里面,编辑下面的文件

//app.js
// 加载express 模块.
var express = require('express'),
app = express.createServer();
 
// 响应”/”请求为 'Hello World'.
app.get('/', function(req, res){
        res.send('Hello World! Yunzhonge');
});
 
// 像一个真实服务器那样监听在80端口
app.listen(80);
console.log('Express server started successfully.')


不要担心node.js的语法的和我们的案例。我们需要一个快速的部署案例,这个案例可以用Python,Perl,Java,PHP或者其他编程语言来写,但是因为Node是非常简单的语言,运行一个简单的轻量级的环境,它是一个非常不错的语言来测试你的服务器。


因为这个小app依赖于Express(一个简单的Node的HTTP框架),我们同样需要通过一个package.json文件告诉NPM关于它的依赖关系,这个文件与app.js处于相同的路径下面。

{
        "name": "examplenodeapp",
        "description": "Example Express Node.js app.",
        "author": "yunzhonghe",
        "dependencies": {
        "express": "3.x.x"
        },
        "engine": "node >= 0.10.6"
}

然后添加下面内容到你的playbook里面,拷贝整个app到这个服务器,然后让npm下载依赖的东西,(这里为express.)

 - name: Ensure Node.js app folder exists.
     file: "path={{ node_apps_location }} state=directory"
 
   - name: Copy example Node.js app to server.
     copy: "src=app dest={{ node_apps_location }}"
 
   - name: Install app dependencies defined in package.json.
     npm: "path={{ node_apps_location }}/app"
  1. 首先我们使用file模块确保我们安装的app目录存在。` node_apps_location `变量可以在vars部分定义,vars部分位于playbook的顶部。当然也可以在inevntory中定义,也可以在运行ansible-playbook的时候定义。

  2. 我们使用Ansible的copy模块拷贝这整个app文件夹到测试服务器,copy模块可以聪明的区分单一的文件和包含文件的目录,然后在目录中递归,就像rsync或scp。Ansible的copy模块在单个文件或少量文件时候非常好用,但是如果你拷贝大量的文件,嵌套几层的目录,copy模块就不能胜任。这种情形下,如果你想拷贝整个目录,你最好考虑使用synchronize模块,如果你想拷贝一个归档,然后展开它,最好使用unarchive模块。

  3. 第三步,我们使用npm模块,这次除了app的路径之外没有额外的参数。这告诉NPM来解析package.json文件,然后确保所有的依赖关系都存在。

已经都完成了,最后一步是启动这个app


1.3运行一个Node.js app

我们现在使用forever来启动这个app。

   - name: Check list of running Node.js apps.
     command: forever list
     register: forever_list
     changed_when: false
 
   - name: Start example Node.js app.
     command: "forever start {{ node_apps_location }}/app/app.js"
     when: "forever_list.stdout.find('{{ node_apps_location }}/app/app.js') == -1"


在这个play中,我们做了两件新的事情。

  1. register 创建了一个新的变量,forever_list,以便于下次task的时候使用用于判断是否允运行下一个命令。register用于保存命令的输出包括标准输出和错误输出,然后赋给变量名。

  2. changed_when告诉Ansible什么时候这个play会导致改变。在这里,forever list命令永远都不会导致服务器的改变,因为我们指定了false。


第二个play实际上使用forever启动了这个app。我们可以启动这个app通过调用node ` node_apps_location `/app/app.js,不过这种方式更难控制。


Forever跟踪它管理的Node app,然后我们使用Forever的list选项,打印一系列的运行app。我们第一次运行这个playbook时候,这list明显是空的,但是判断为空之后就会运行,如果app正在运行,我们不想启动另外一个实例了,为了避免这种情形,我们使用when语句,指定,当app的路径不在forever list的输出信息的时候,我们启动这个app。


1.4Node.js app服务器总结。

在这时候上,你已经完成了playbook,然后安装一个简单的Node.js app,在80端口响应HTTP请求。

为了运行这个playbook在一个服务器上,使用下面的命令,传递node_apps_location变量通过命令


ansible-playbook --extra-vars="node_apps_location=/usr/local/opt/node"



当服务器完成配置和部署服务器的时候,在浏览器中指定测试服务器的主机名查看效果

1450138559600246.png

简单,但是有效,我们已经在少于50行的YMAL文件中配置了一个Nodejs应用服务器


到此结束,非常感谢朋友们的关注。

下面发一个连接

资源:https://nqdeng.github.io/7-days-nodejs/   七天学会Node.JS


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP