Ansible 部署 Node.js

目錄

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添加額外的源

在準備應用一個服務器的時候,爲了確保指定些軟件包可以用或者在最新的版本,管理員經常首先添加額外的源。

下面的腳本,我們想要添加EPELRemi源,以便於我們可以得到類似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腳本用於導入EPELRemiGPG 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的語法的和我們的案例。我們需要一個快速的部署案例,這個案例可以用PythonPerlJavaPHP或者其他編程語言來寫,但是因爲Node是非常簡單的語言,運行一個簡單的輕量級的環境,它是一個非常不錯的語言來測試你的服務器。

 

因爲這個小app依賴於Express(一個簡單的NodeHTTP框架),我們同樣需要通過一個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,然後我們使用Foreverlist選項,打印一系列的運行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

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章