Ansible + Vagrant + Expressjs

來源:互聯網
上載者:User

標籤: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


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.