標籤:expressjs vagrant forever ansible devops
據某大牛說,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
<!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express</p></body></html>%
Ok,這樣我們就已經搭建了一個hello world的express伺服器的code base了
建立Ansible Playbooks
目錄結構如下:
在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
<!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express</p></body></html>%
結果和本地是一模一樣的,搞定
參考資料:
https://servercheck.in/blog/start-nodejs-app-with-forever-and-ansible
http://cnodejs.org/topic/5021c2cff767cc9a51e684e3