Ubuntu Juju 是一套 Canonical 設計給使用 Ubuntu 做為雲端平台的一套工具。
基本概念是輕鬆地使用一堆專家們精心寫好的 Juju Charms,無痛地將網路服務部署到使用 Ubuntu 的雲端平台上面。
Ubuntu Juju 目前支援的雲端平台有 Amazon Web Services (AWS), Microsoft Azure, HP Cloud, OpenStack, MAAS, Local,而 Ubuntu Juju 的工具本身可以在 Ubuntu, Mac OS X, Windows 上面安裝使用。
而 Ubuntu Juju 的 Local Provider 就是利用 Linux Container (LXC) 來在自己的主機上面架設使用 Ubuntu Juju,以下就是介紹 Local Provider 的設定方法。(窮人省錢的雲端解決方案)
首先當然要有一個 Ubuntu 12.04 以上的系統,然後先要加入 ppa:juju/stable 這個 PPA 然後更新索引:
$ sudo apt-add-repository ppa:juju/stable
$ sudo apt-get update
接下來安裝所需要的軟體套件。
如果是 Ubuntu 12.04 的話執行:
$ sudo apt-get install juju-local linux-image-generic-lts-raring linux-headers-generic-lts-raring
然後重新啟動系統來使用 linux-lts-raring 的 kernel
如果是其它比 Ubuntu 12.04 新的版本的話執行:
$ sudo apt-get install juju-local
然後檢查一下 MongoDB 有沒有支援 SSL (這點很重要,一定要支援 SSL 否則就無法使用):
$ mongod -h | grep ssl
--sslOnNormalPorts use ssl on configured ports
--sslPEMKeyFile arg PEM file for ssl
--sslPEMKeyPassword arg PEM file password
還有要檢查一下 LXC 的 DHCP server 有沒有被執行起來 (這點也很重要,不然 LXC 的網路就無法正常運作):
$ ps aux | grep lxc-dnsmasq
dnsmasq 1640 0.0 0.0 26080 900 ? S 10:13 0:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/lxc/dnsmasq.pid --conf-file= --listen-address 10.0.3.1 --dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative
user 12013 0.0 0.0 13660 952 pts/2 S+ 15:47 0:00 grep --color=auto lxc-dnsmasq
接下來就可以產生 Juju 的設定檔了:
$ juju init
A boilerplate environment configuration file has been written to /home/user/.juju/environments.yaml.
Edit the file to configure your juju environment and run bootstrap.
然後修改一下 ~/.juju/environments.yaml 將 "default: amazon" 改成 "default: local",接下來就可以執行 `sudo juju bootstrap` 來產生 Local Provider 所需要的環境。
`sudo juju bootstrap` 所做的動作就是產生 ~/.juju/local-cert.pem 及 ~/.juju/local-private-key.pem 還有 /etc/init/juju-*.conf 的檔案來執行一個 MongoDB Server 給 Juju 使用。
接下來執行 Ubuntu Juju 的資料就會全部儲存在 ~/.juju/local/ 目錄底下了。
$ sudo tree .juju
.juju
├── charmcache
│ ├── cs_3a_precise_2f_mysql-27.charm
│ └── cs_3a_precise_2f_wordpress-16.charm
├── environments.yaml
├── local
│ ├── agents
│ │ └── machine-0
│ │ └── agent.conf
│ ├── db
│ │ ├── admin.0
│ │ ├── admin.ns
│ │ ├── journal
│ │ │ ├── j._0
│ │ │ ├── lsn
│ │ │ ├── prealloc.1
│ │ │ └── prealloc.2
│ │ ├── juju.0
│ │ ├── juju.ns
│ │ ├── mongod.lock
│ │ ├── presence.0
│ │ ├── presence.ns
│ │ └── _tmp
│ ├── log
│ │ └── machine-0.log
│ ├── server.pem
│ ├── shared-storage
│ ├── storage
│ │ ├── bootstrap-verify
│ │ ├── provider-state
│ │ └── tools
│ │ ├── juju-1.14.0.1-precise-amd64.tgz
│ │ └── juju-1.14.0.1-raring-amd64.tgz
│ └── tools
│ └── 1.14.0.1-raring-amd64
│ ├── downloaded-url.txt
│ ├── FORCE-VERSION
│ └── jujud
├── local-cert.pem
└── local-private-key.pem
13 directories, 26 files
像是如果要架設一台 WordPress Blog Server 就只需要執行以下四行指令:
$ juju deploy wordpress
$ juju deploy mysql
$ juju add-relation wordpress mysql
$ juju expose wordpress
因為建構這些服務需要一些時間去網路上抓取資料回來安裝設定,所以馬上執行 `juju status` 會看到以下輸出,表示動作還沒有完成:
$ juju status
environment: local
machines:
"0":
agent-state: started
agent-version: 1.14.0.1
dns-name: 10.0.3.1
instance-id: localhost
series: raring
"1":
instance-id: pending
series: precise
"2":
instance-id: pending
series: precise
services:
mysql:
charm: cs:precise/mysql-27
exposed: false
relations:
cluster:
- mysql
db:
- wordpress
units:
mysql/0:
agent-state: pending
machine: "2"
wordpress:
charm: cs:precise/wordpress-16
exposed: true
relations:
db:
- mysql
loadbalancer:
- wordpress
units:
wordpress/0:
agent-state: pending
machine: "1"
過一會後再執行 `juju status` 就可以看到全部完成的結果了。
$ juju status
environment: local
machines:
"0":
agent-state: started
agent-version: 1.14.0.1
dns-name: 10.0.3.1
instance-id: localhost
series: raring
"1":
agent-state: started
agent-version: 1.14.0.1
instance-id: user-local-machine-1
instance-state: missing
series: precise
"2":
agent-state: started
agent-version: 1.14.0.1
instance-id: user-local-machine-2
instance-state: missing
series: precise
services:
mysql:
charm: cs:precise/mysql-27
exposed: false
relations:
cluster:
- mysql
db:
- wordpress
units:
mysql/0:
agent-state: started
agent-version: 1.14.0.1
machine: "2"
public-address: 10.0.3.158
wordpress:
charm: cs:precise/wordpress-16
exposed: true
relations:
db:
- mysql
loadbalancer:
- wordpress
units:
wordpress/0:
agent-state: started
agent-version: 1.14.0.1
machine: "1"
open-ports:
- 80/tcp
public-address: 10.0.3.69
然後就可以連到 10.0.3.69 這個 IP 就可以開始使用 WordPress 了。 :-)
如果想要清掉這些服務,只要執行下面一行指令:
$ sudo juju destroy-environment
WARNING: this command will destroy the "local" environment (type: local)
This includes all machines, services, data and other resources.
Continue [y/N]? y
這樣就會將之前用 `sudo juju bootstrap` 產生的環境整個清除乾淨。
$ tree .juju
.juju
├── charmcache
│ ├── cs_3a_precise_2f_mysql-27.charm
│ └── cs_3a_precise_2f_wordpress-16.charm
├── environments.yaml
├── local-cert.pem
└── local-private-key.pem
1 directory, 5 files