《Ansible部署Node.js,讓你從簡操作》要點:
本文介紹了Ansible部署Node.js,讓你從簡操作,希望對您有用。如果有疑問,可以聯系我們。
相關主題:node.js web開發
下面我們將要在我們的CentOS6.x服務器上配置Nodejs,啟動一個簡單的nodejs實例,這個服務器有很簡單的架構.
開始了,首先創建一個playbook文件,我們盡量讓它保持簡單.
--- - hosts: all tasks:
定義一些運行這個playbook的主機,然后下面列出一系列的tasks.
在準備應用一個服務器的時候,為了確保指定些軟件包可以用或者在最新的版本,管理員經常首先添加額外的源.
下面的腳本,我們想要添加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命令,這樣我們可以做其它的兩件事情.
使用creatse參數告訴Ansible什么時候不運行這個命令,這個例子里,我們告訴Ansible,這個命令成功執行后,將會創建那些文件.當這個文件存在的時候,這個命令將不會運行.
使用with_items定義一個URL和用于creates檢查的文件.
yum負責安裝EPEL源.
4、因為這個服務器我們將用來做測試用,所以我們使用service模塊禁止系統防火墻,防止它干涉我們測試.
5、yum安裝Node.js(同時安裝npm,Node’s package manager),我們使用enablerepo來指定在EPEL源中搜索它,當然也可以使用disablerepo來指定不使用那個源(repository).
6、因為NPM現在被安裝了,我們使用Ansible 的npm模塊安裝Node.JS工具forever,forever來運行我們的app,設置global為yes,告訴NPM安裝模塊在/usr/lib/node_modules位置,然后所有的用戶都可以使用它了.
這一步是在我們的服務器上部署簡單的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"
首先我們使用file模塊確保我們安裝的app目錄存在.{{ node_apps_location }}變量可以在vars部分定義,vars部分位于playbook的頂部.當然也可以在inevntory中定義,也可以在運行ansible-playbook的時候定義.
我們使用Ansible的copy模塊拷貝這整個app文件夾到測試服務器,copy模塊可以聰明的區分單一的文件和包含文件的目錄,然后在目錄中遞歸,就像rsync或scp.Ansible的copy模塊在單個文件或少量文件時候非常好用,但是如果你拷貝大量的文件,嵌套幾層的目錄,copy模塊就不能勝任.這種情形下,如果你想拷貝整個目錄,你最好考慮使用synchronize模塊,如果你想拷貝一個歸檔,然后展開它,最好使用unarchive模塊.
第三步,我們使用npm模塊,這次除了app的路徑之外沒有額外的參數.這告訴NPM來解析package.json文件,然后確保所有的依賴關系都存在.
已經都完成了,最后一步是啟動這個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.
在這時候上,你已經完成了playbook,然后安裝一個簡單的Node.js app,在80端口響應HTTP請求.
為了運行這個playbook在一個服務器上,使用下面的命令,傳遞node_apps_location變量通過命令
ansible-playbook --extra-vars="node_apps_location=/usr/local/opt/node"
當服務器完成配置和部署服務器的時候,在瀏覽器中指定測試服務器的主機名查看效果
簡單,但是有效,我們已經在少于50行的YMAL文件中配置了一個Nodejs應用服務器
到此結束,非常感謝朋友們的關注.
問
當我在給100臺服務器進行nodejs app部署的時候,到20臺中斷了,我再重新執行,他是一個怎么個過程,前面已經安裝的軟件包,進行的配置的會重新的再進行執行一遍還是跳過呢?麻煩大牛解答
答
Ansible自身有冪等特性使其能有效保證所有操作的安全可靠性,針對執行失敗的情況會自動在家目錄下生成 對應的錯誤服務器列表 通過 —limit 再次有針對性的完成剩余工作
問
請問大俠的nodejs 是通過工具部署的?
答
npm 好復雜啊哈,npm的配置是一次性的,初始配置確認比較耗時且麻煩,yum 或 npm 各有優劣,視業務而定吧
問
—extra-vars= 請問企業中應用的多嗎?
答
多,最少在我們的工作中一直有應用,前幾期的分享大家應該也有看到,這個參數應用的很多.但官網介紹的卻一筆代過.還是建議大家多用
問
當我通過ansible執行任務的過程中,會出現任務被長時間卡主的原因,這一般需要重哪些地方排查呢
答
很多朋友遇到這個問題,一直有問,根據個人的經驗建議如下幾個方面排查:
確實當前命令執行時間不長,
pong 檢測服務器存活
有些命令需連接外網下載更新耗時較長的可檢查網絡寬帶情況
-vvv 是非常好的排查方式
如若卻無解,/etc/ansible/ansible.cfg 中縮短操作執行時長,等待最終結束嘗試
文:Real_man
原文鏈接:http://www.jianshu.com/p/1db87e8a4bd1,著作權歸作者所有
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4462.html