今天我們要來建立一個簡單的 Hello World 網頁,會用到以下:
通常要增加 yum 或是 apt 的 repository 都會用以下的 shell script 來達成,以 EPEL 及 Remi 為例:
# Import Remi GPG key.
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
# Install Remi repo
rpm -Uvh --quiet http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# Install EPEL repo
yum install epel-release
# Install Node.js (npm plus all its dependencies).
yum --enablerepo=epel install node
如果只是一台機器的話,手動打這些指令很OK,但:
Ansible 可以使得上面的 shell script 更強健:
---
- hosts: all
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-7.rpm"
- creates: "/etc/yum.repos.d/remi.repo"
- name: Install EPEL repo.
yum: name=epel-release state=present
- name: Ensure firewalld is stopped (since this is for testing).
service: name=firewalld state=stopped
- name: Install Node.js and npm.
yum: name=npm state=present enablerepo=epel
- name: Install Forever (to run our Node.js app).
npm: name=forever global=yes state=present
下一步當然是寫一個簡單的 node.js application 囉:
// filename app.js
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
既然我們引用了 express,那自然是要調整一下套件管理的內容,也就是要在建立一個叫 package.json 的檔案,並在裡頭加上以下:
{
"name": "examplenodeapp",
"description": "Example Express Node.js app.",
"author": "Jeff Geerling <geerlingguy@mac.com>;",
"dependencies": {
"express": "3.x.x"
},
"engine": "node >= 0.10.6"
}
前面我們在 playbook 裡寫到安裝 nodejs/npm 就停手了,但其實還要將程式部署呢
- name: Ensure Node.js app folder exists
file: "path={{ node_apps_location }} state=directory"
- name:
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
部署完之後當然是要啟動囉
- 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"
綜合以上,完整的 playbook.yml 如下:
---
- hosts: all
become: yes
vars:
node_apps_location: /usr/local/opt/node
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-7.rpm"
creates: "/etc/yum.repos.d/remi.repo"
- name: Install EPEL repo.
yum: name=epel-release state=present
- name: Ensure firewalld is stopped (since this is for testing).
service: name=firewalld state=stopped
- name: Install Node.js and npm.
yum: name=npm state=present enablerepo=epel
- name: Install Forever (to run our Node.js app).
npm: name=forever global=yes state=present
- 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
- 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"
vagrant up
以上就是透過 Ansible 部署一個 nodejs application,之後的篇幅都會愈來愈趨近實用的案例,不會是這種 Hello World 系列的
下一篇將會部署一個完成的 LAMP + Drupal